html - 如何用 Perl 解析无效的 HTML?

标签 html perl parsing html-parsing

我维护一个 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/

相关文章:

html - iPhone 上的 Safari 是否有等同于 Android 的 &lt;meta name ='viewport' content ='target-densitydpi=device-dpi' > 的东西?

perl - 使用键@array 而不是 0 .. $#array 有什么好处吗?

java - 如何在 Java 中解析格式错误的 XML?

jquery - 切换 Angular 以将文本移动到 fabricjs 中的原始位置

javascript - 如何为两个类添加相同的功能?

perl - 如何在 Perl 中将数组数据插入 MySQL?

perl - 引用 Perl 运算符

php - 如何在 PHP 中获取 DIV 的 HTML 内容

parsing - 编译 Mac 版 BLLIP 解析器时出错

javascript - 关闭 Accordion 菜单的所有选项卡