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 を指定した場合、上記の場合は 0 B である FTP 値が必要であるとします。

どうすればこれを達成できますか?

4

2 に答える 2

1

これは、HTML :: TreeBuilder :: XPathを使用して非常に簡単に行うことができます(OK、楽しい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れているaを探します(スペースを正規化することをお勧めします)。次に、次の兄弟テキストを取得します。これを包んで結果をクリーンアップします、Voilà!div'FTB'normalize-space

于 2012-09-26T13:36:42.653 に答える
1

HTML を解析する Perl モジュールがいくつかあります。それらのいずれかを試してから、問題がある場合は具体的な質問をすることをお勧めします.

これに関する多くの情報は、SO および Web で入手できます。利用可能なモジュールのいくつかを示す質問の例を次に示します: Perl で <div class ="foo"> と </div> の間を簡単に解析する方法

于 2012-09-26T13:10:28.843 に答える