1

我有一个 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。

我怎样才能做到这一点?

4

2 回答 2

1

有几个 Perl 模块可以为您解析 HTML。我建议您尝试其中一种,如果您有任何问题,请提出具体问题。

SO 和网络上有很多关于这方面的信息。下面是一个示例问题,它将向您指出一些可用的模块:如何在 Perl 中轻松地在 <div class ="foo"> 和 </div> 之间进行解析

于 2012-09-26T13:10:28.843 回答
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 表达式:在 abr中查找 a div,它是之前的同级文本'FTB'(您可能希望规范化那里的空格)。然后取下一个兄弟文本。把它包normalize-space起来清理结果,瞧!

于 2012-09-26T13:36:42.653 回答