10

私は Perl を使い始めたばかりで、Web スクレイピングを行うための簡単なスクリプトを作成しました。私は WWW::Mechanize と HTML::TreeBuilder を使用してほとんどの作業を行っていますが、いくつかの問題に遭遇しました。私は次のHTMLを持っています:

<table class="winsTable">
    <thead>...</thead>
    <tbody>
        <tr>
            <td class = "wins">15</td>
        </tr>
    </tbody>
</table>

テーブルからデータを取得するモジュールがいくつかあることは知っていますが、これは特殊なケースです。必要なすべてのデータがテーブルにあるわけではありません。だから、私は試しました:

my $tree = HTML::TreeBuilder->new_from_url( $url );
my @data = $tree->find('td class = "wins"');

しかし、@data空に戻った。でデータを正常に解析したので、このメソッドがクラス名なしで機能することはわかってい$tree->find('strong')ます。では、このタイプの HTML 構文を処理できるモジュールはありますか? HTML::TreeBuilder のドキュメントをざっと調べたところ、何もないように見えましたが、間違っている可能性があります。

4

4 に答える 4

10

メソッドを使用して、look_down探している特定のタグと属性を見つけることができます。これはHTML::Elementモジュール内にあります ( によってインポートされHTML::TreeBuilderます)。

my $data = $tree->look_down(
    _tag  => 'td',
    class => 'wins'
);

print $data->content_list, "\n" if $data; #prints '15' using the given HTML

$data = $tree->look_down(
    _tag  => 'td',
    class => 'losses'
);

print $data->content_list, "\n" if $data; #prints nothing using the given HTML
于 2013-07-14T04:13:05.637 に答える
1

(これはdspain の補足的な回答のようなものです)

実際、HTML::TreeBuilder のドキュメントで次のような箇所を見逃していました。

このクラスのオブジェクトは、HTML::Parser と HTML::Element の両方のメソッドを継承します。HTML::Parser から継承されたメソッドは HTML ツリーの構築に使用され、HTML::Element から継承されたメソッドはツリーを精査するために使用されます。この (HTML::TreeBuilder) ドキュメントに加えて、HTML::Element ドキュメントも注意深く読み、 HTML::Parser ドキュメントもざっと読む必要があります。おそらく、その parse メソッドと parse_file メソッドだけが興味深いものです。

(太字の書式設定は私のものであり、ドキュメントにはありません)

これは、 HTML::Element のドキュメントも読む必要があることを示していfindます

これは find_by_tag_name の単なるエイリアスです

これは、クラス名に対しては機能しないことを示しているはずですが、その説明には、少し下にあるlook_downメソッドについても言及されています。例を見ると、それがあなたが望むことをすることがわかります。そして、dspainの答えは、あなたの場合の正確な方法を示しています。

公平を期すために、ドキュメントはナビゲートするのがそれほど簡単ではありません。

于 2013-07-21T01:12:30.450 に答える