我正在尝试使用XPath
来提取一些HTML标记和数据,为此我需要使用XML::LibXML
模块。
我尝试从CPAN shell安装它,但它没有安装。
我按照CPAN网站上有关安装的说明操作,我们需要在安装libxml2
之前安装iconv
,zlib
和XML::LibXML
包装,但它不起作用出。
此外,如果还有其他更简单的模块可以完成我的任务,请告诉我。
手头的任务:
我在html网页上搜索特定的<dd>
标记,该标记非常大(约5000 - 10000)<dd>
和<dt>
标记。因此,我正在编写一个与<dd>
标记内的内容匹配的脚本,并在相应的(下一个)<dt>
标记内提取内容。
我希望我能更清楚一点。非常感谢任何帮助。
答案 0 :(得分:6)
如果您使用的是ActiveState Perl,则应将ActivePerl 10xx Win32 PPM packages中列出的存储库添加到ppm
,然后使用
ppm install XML::LibXML
尝试将HTML解析为XML通常不是一项令人愉快的任务。我认为HTML::TokeParser更适合这项任务。
#!/usr/bin/perl
use strict;
use warnings;
use HTML::TokeParser;
my $p = HTML::TokeParser->new(\*DATA);
my @definitions;
while ( my $dl_tag = $p->get_tag('dl') ) {
while ( my $dt_tag = $p->get_tag('dt') ) {
my $term = $p->get_trimmed_text('/dt');
my $dd_tag = $p->get_tag('dd');
my $defn = $p->get_trimmed_text('/dd');
push @definitions, [$term, $defn];
}
}
use Data::Dumper;
print Dumper \@definitions;
__DATA__
<dl>
<dt>One</dt>
<dd>1</dd>
<dt>Two</dt>
<dd>2</dd>
</dl>
输出:
$VAR1 = [ [ 'One', '1' ], [ 'Two', '2' ] ];
答案 1 :(得分:1)
如果你只是想要XPath查询,那么我昨天写了一个脚本,它使用XML :: XPath :: XMLParser对xml文件进行XPath查询。
我已经使用Activestate的perl安装和Windows上的草莓perl进行了测试。
我不记得要去cpan安装任何模块(虽然我可能早点忘了这样做:)),所以也许你可以使用XML :: XPath模块呢?
以下是文档中的示例
use XML::XPath;
use XML::XPath::XMLParser;
my $xp = XML::XPath->new(filename => 'test.xhtml');
my $nodeset = $xp->find('/html/body/p'); # find all paragraphs
foreach my $node ($nodeset->get_nodelist) {
print "FOUND\n\n",
XML::XPath::XMLParser::as_string($node),
"\n\n";
}
答案 2 :(得分:1)
假设您正在使用ActiveState Perl,您可以使XML::LibXML正常工作。 您可以从Randy Kobes' site获取XML :: LibXML,并从zlatkovic.com
获取libxslt / libxml等我首先安装libxml,然后使用ppm安装XML :: LibXML。工作得很好。
如果您正在使用Strawberry Perl,CPAN应该适合您,因为libxml2等是我相信的Strawberry Perl发行版的一部分。
答案 3 :(得分:0)
另请参阅帖子How do I install XML::LibXML for ActivePerl?中的帖子。
讨论我在使用PPM安装XML-LibXML时遇到的一些问题/解决方案。