我维护一个 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 ,但我相信那是精神错乱。
请记住,尝试构建树表示的解析器将比只识别各种元素的流解析器更严格。
关于html - 如何用 Perl 解析无效的 HTML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11335503/