我应该使用HTML :: Parser或XML :: Parser来提取和替换文本吗?

时间:2010-02-08 08:59:45

标签: html xml perl parsing

我期待能够从HTML / XHTML文档中提取所有纯文本并进行分析/修改,然后根据需要进行替换。我可以使用HTML::Parser执行此操作,还是应该XML::Parser

有没有人知道的好演示?

4 个答案:

答案 0 :(得分:4)

HTML :: Parser的方法基于令牌和回调。当您在提取或更改数据的上下文中出现特别复杂的条件时,我发现这非常方便。

否则我更喜欢基于树的方法。 HTML::TreeBuilder::XPath(基于HTML :: Parser的ultimely)允许您使用XPath查找节点。它返回HTML::Element s。文档有点稀缺(好吧,分布在几个模块上)。但仍然是挖掘HTML的快捷方式。

如果处理纯XML,XML::Twig是一个出色的解析器:非常好的内存管理,允许结合树和流方法。文档非常好。

答案 1 :(得分:3)

您还应该查看Web::Scraper 我发现这个模块比HTML :: Parser模块更容易,但如果您熟悉XPath,它会有所帮助 根据实际页面的不同,解析HTML是非常不可预测的 - 就像pdf-display而不是面向数据。

答案 2 :(得分:3)

在某人的StackOverflow用户页面中,您想要用Perl替换所有PERL实例。你可以用

这样做
#! /usr/bin/perl

use warnings;
use strict;

use HTML::Parser;
use LWP::Simple;

my $html = get "http://stackoverflow.com/users/201469/phil-jackson";
die "$0: get failed" unless defined $html;

sub replace_text {
  my($skipped,$markup) = @_;
  $skipped =~ s/\bPERL\b/Perl/g;
  print $skipped, $markup;
}

my $p = HTML::Parser->new(
  api_version => 3,
  marked_sections => 1,
  case_sensitive => 1,
  unbroken_text => 1,
  xml_mode => 1,
  start_h => [ \&replace_text => "skipped_text, text" ],
  end_h => [ \&replace_text => "skipped_text, text" ],
);

# your page may use a different encoding
binmode STDOUT, ":utf8" or die "$0: binmode: $!";
$p->parse($html);

输出是我们所期望的:

$ wget -O phil-jackson.html http://stackoverflow.com/users/201469
$ ./replace-text >out.html
$ diff -ub phil-jackson.html out.html
--- phil-jackson.html
+++ out.html
@@ -327,7 +327,7 @@

 PERL:  

-#$linkTrue =  &hellip; ">comparing PERL md5() and PHP md5()</a></h3>
+#$linkTrue =  &hellip; ">comparing Perl md5() and PHP md5()</a></h3>

         <div class="tags t-php t-perl t-md5">
             <a href="/questions/tagged/php" class="post-tag" title="show questions tagged 'php'" rel="tag">php</a> <a href="/questions/tagged/perl" class="post-tag" title="show questions tagged 'perl'" rel="tag">perl</a> <a href="/questions/tagged/md5" class="post-tag" title="show questions tagged 'md5'" rel="tag">md5</a> 

“PERL:”sore thumb是元素属性的一部分,而不是文本部分。

答案 3 :(得分:1)

您应该使用哪个模块取决于您要执行的操作。对于初学者,HTML::Parser附带了很好的示例,其中还包括从HTML文档中提取纯文本的脚本。

不要尝试使用XML解析器解析HTML文档:您会发现自己陷入了痛苦的世界,因为许多有效的HTML构造都不是有效的XML。

不要尝试使用HTML解析器解析XML文档:在解析XML文档之前,您将失去更严格要求的所有优点。