如何使用Perl解析无效的HTML?

前端之家收集整理的这篇文章主要介绍了如何使用Perl解析无效的HTML?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我维护一个 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一次一步地构建一棵树,但我相信这种方式就是疯狂.

请记住,尝试构建树表示的解析器将比仅在识别它们时识别各种元素的流解析器更严格.

原文链接:https://www.f2er.com/Perl/171747.html

猜你在找的Perl相关文章