我有一个html文件“statistics.htm”。将html文件中的数据转换为变量。
假设在变量i中有以下数据:
<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.
我怎样才能实现这个目标?
答案 0 :(得分:1)
有几个Perl模块可以为您解析HTML。我建议你试试其中之一,如果你有任何问题,请提出具体问题。
有关此内容的大量信息可在SO和网站上找到。这是一个示例问题,它将指向您可用的一些模块:How to parse between <div class ="foo"> and </div> easily in Perl。
答案 1 :(得分:1)
您可以使用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表达式:在br
中查找div
,前一个兄弟文本为'FTB'
(您可能希望将空格标准化)。然后采取下一个兄弟文本。用normalize-space
包裹它来清理结果,Voilà!