匹配一个字符串并在perl中获取它旁边的单词

时间:2012-09-26 13:03:54

标签: perl

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

我怎样才能实现这个目标?

2 个答案:

答案 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à!