加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:59:24 所属栏目:大数据 来源:网络整理
导读:我维护一个 HTML格式的文章数据库.不幸的是,编写文章的编辑并不知道正确的HTML,所以他们经常写下这样的东西: div class="highlight"htmlhead/headbodypNote that .../p/html/div 我尝试使用HTML :: TreeBuilder来解析这个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一次一步地构建一棵树,但我相信这种方式就是疯狂.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读