我有一个html文件"statistics.htm“。将html文件中的数据转换为一个变量。
假设在变量中,我有以下数据:
<ul class="chart-legend">
<li class="label-1">
<div><em></em>FTP<br>
0 B</div>
</li>
<li class="label-2">
<div><em></em>HTTP<br>
589 KB</div>
</li>
<li class="label-3">
<div><em></em>POP3/IMAP<br>
0 B</div>
</li>
<li class="label-4">
<div><em></em>SMTP<br>
0 B</div>
</li>
</ul>假设客户给出FTP作为参数,我想要FTP值,在上面的情况下是0 B。
我如何才能做到这一点?
发布于 2012-09-26 21:36:43
您可以非常简单地使用HTML::TreeBuilder::XPath (好的,非常简单,直到您看到有趣的XPath查询!):
#!/usr/bin/perl
use strict;
use warnings;
use HTML::TreeBuilder::XPath;
my $html= HTML::TreeBuilder::XPath->new->parse_file( \*DATA);
my $ftp= $html->findnodes( 'normalize-space( //div/br[./preceding-sibling::text()="FTP"]/following-sibling::text())');
print "$ftp\n";
__DATA__
<ul class="chart-legend">
<li class="label-1">
<div><em></em>FTP<br>
0 Ba</div>
</li>
<li class="label-2">
<div><em></em>HTTP<br>
589 KB</div>
</li>
<li class="label-3">
<div><em></em>POP3/IMAP<br>
0 Bb</div>
</li>
<li class="label-4">
<div><em></em>SMTP<br>
0 Bc</div>
</li>
</ul>XPath表达式:在之前同级文本为'FTB'的div中查找br (您可能希望规范化其中的空格)。然后获取下一个同级文本。将其包装在normalize-space中以清理结果,瞧!
发布于 2012-09-26 21:10:29
有几个Perl模块可以为您解析HTML。我建议你尝试其中一个,然后问一个具体的问题,如果你有任何问题。
许多关于这方面的信息都可以在SO和网络上找到。这里有一个示例问题,它将为您提供一些可用的模块:How to parse between and easily in Perl。
https://stackoverflow.com/questions/12602388
复制相似问题