我期待能够从HTML/XHTML文档中提取所有纯文本并进行分析/修改,然后在需要时进行替换。我可以使用HTML::Parser来做到这一点,还是应该使用XML::Parser?我应该使用HTML :: Parser还是XML :: Parser来提取和替换文本?
是否有任何人都知道的好示范?
我期待能够从HTML/XHTML文档中提取所有纯文本并进行分析/修改,然后在需要时进行替换。我可以使用HTML::Parser来做到这一点,还是应该使用XML::Parser?我应该使用HTML :: Parser还是XML :: Parser来提取和替换文本?
是否有任何人都知道的好示范?
你也应该看看Web::Scraper。
我发现这个模块比HTML :: Parser模块更容易,但是如果您熟悉XPath,它会有所帮助。
取决于实际页面,解析HTML是非常不可预测的 - 它就像pdf显示,而不是数据导向。
HTML :: Parser的方法基于令牌和回调。当您在想要提取或更改数据的上下文中出现特别复杂的条件时,我发现它非常方便。
否则我更喜欢基于树的方法。 HTML::TreeBuilder::XPath(基于HTML :: Parser的ultimely)允许您使用XPath查找节点。它返回HTML::Element s。该文档有点稀缺(好吧,分散在几个模块中)。但仍然是挖掘HTML的快速方法。
如果您处理纯XML,XML::Twig是一款出色的解析器:非常好的内存管理,可以将树和流方法结合起来。文件非常好。
说在某人的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 = … ">comparing PERL md5() and PHP md5()</a></h3> +#$linkTrue = … ">comparing Perl md5() and PHP md5()</a></h3> <div class="tags t-php t-perl t-md5"> <a href="https://stackoverflow.com/questions/tagged/php" class="post-tag" title="show questions tagged 'php'" rel="tag">php</a> <a href="https://stackoverflow.com/questions/tagged/perl" class="post-tag" title="show questions tagged 'perl'" rel="tag">perl</a> <a href="https://stackoverflow.com/questions/tagged/md5" class="post-tag" title="show questions tagged 'md5'" rel="tag">md5</a>
的“PERL:”突兀的元素属性,而不是文本段的一部分。
你应该使用哪个模块取决于你正在尝试做什么。对于初学者,HTML::Parser附带了很好的例子,其中还包括一个从HTML文档中提取纯文本的脚本。
不要尝试使用XML解析器解析HTML文档:由于大量有效的HTML构造不是有效的XML,因此您会发现自己处于痛苦的世界。
不要尝试使用HTML解析器解析XML文档:您将失去XML文档在可以解析之前格式良好的更严格要求的所有优点。