我维护一个
HTML格式的文章数据库.不幸的是,编写文章的编辑并不知道正确的HTML,所以他们经常写下这样的东西:
<div class="highlight"><html><head></head><body><p>Note that ...</p></html></div>
我尝试使用HTML :: TreeBuilder来解析这个HTML,但在解析它并转储结果树之后,< div class =“highlight”> …< / div>之间的所有元素都被解析了.消失了.我只剩下< div class =“highlight”>< / div>.
编辑经常也做过这样的事情:
<div class="article"><style>@font-face { font-family: "Cambria"; }</style>Article starts here</div>
使用HTML :: TreeBuilder解析此结果为空< div class =“article”>< / div>再次.
任何想法如何处理这个破碎的HTML,并真正理解它?
解决方法
我会先通过
HTML::Tidy运行它:
#!/usr/bin/env perl use strict; use warnings; use HTML::Tidy; my $html = <<EO_HTML; <div class="highlight"><html><head></head> <body><p>Note that ...</p></html> </div> EO_HTML my $tidy = HTML::Tidy->new; print $tidy->clean( $html );
输出:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <Meta name="generator" content="tidyp for Windows (v1.04),see www.w3.org"> <title></title> </head> <body> <div class="highlight"> <p>Note that ...</p> </div> </body> </html>
您可以通过设置各种配置选项来控制输出.
然后,通过解析器提供已清理的HTML.
否则,您可以尝试使用HTML::TokeParser::Simple甚至只是HTML::Parser一次一步地构建一棵树,但我相信这种方式就是疯狂.
请记住,尝试构建树表示的解析器将比仅在识别它们时识别各种元素的流解析器更严格.