1

大量の情報を 1 つの HTML ファイルに抽出するスクリプトを作成しています。ただし、問題のページから特定のリンクのセットのみを抽出するのに苦労しています。

サイトの大まかな構成はこちら。innercontent div と以下に示す内容の間には、他にもいくつかの見出しと段落があります。

<div id="innercontent">
<h1>Download here</h1>
<a href="website.pdf"><img src="stuff"></a>
</div>

現在、div ID「innercontent」に複数のリンクが見つかっているため、文字列に一致させるか、必要なリンクのみを取得する方法を探しています。私が取得しようとしているリンクはすべて .pdf であることを覚えておいてください。私が行った調査に基づいて、TreeBuilder がこれを処理できると確信しています私が試している2つの方法を紹介します。最初のものを使用して解決したいと思います。

# link to pdf of transcript
for ( $mech->look_down(_tag => 'a') ) {
  next unless $_->as_trimmed_text =~ m/pdf/;
  say $_->as_HTML;
}

my @links = $mech->links();
  for my $link ( @links ) {
  print $link->url;
}

後者の方法はページ全体でリンクを検索するだけだと思いますが、その方法がより効率的である場合、またはこれらの方法の両方を組み合わせることができる場合に備えて、後者の方法を含めています.

どんな助けやアドバイスも大歓迎です!

4

2 に答える 2

1

WWW::Mechanizeには、リンクに表示されるテキスト、実際のリンク、ID など、かなりの数の属性に基づいてリンクを抽出する機能があります。

特定の例では、pdf であるリンクを次のようにフェッチします。

my @links = $mech->find_all_links(url_regex=>qr/\.pdf$/)

結果の配列で必要なことは何でもします。

ドキュメントを見ることができます。このドキュメントでは、利用可能なオプションを示します。

于 2015-09-10T20:55:36.300 に答える
0

を使用するHTML::TreeBuilderと、tro を 2 回連続して呼び出す必要がありますlook_down。最初にdivid属性を持つ要素innercontentを検索し、2 番目にそれらの要素を検索して、値が で終わる属性をa持つ要素を検索します。href.pdf

こんな感じです

use strict;
use warnings;

use HTML::TreeBuilder;

my $html = <<END;
<div id="innercontent">
<h1>Download here</h1>
<a href="website.pdf"><img src="stuff"></a>
</div>
END

my $tree = HTML::TreeBuilder->new_from_content($html);

for my $div ( $tree->look_down(_tag => 'div', id => 'innercontent') ) {
    my @anchors = $div->look_down(_tag => 'a', href => qr/\.pdf\z/i );
    print $_->attr('href'), "\n" for @anchors;
}

出力

website.pdf

Mojo::DOMシンプルな CSS アクセサーを使用でき、問題を非常に簡潔に解決できるので、私はこれが好きです。

これは、そのモジュールを使用したソリューションです。出力は上記のソリューションと同じです

use strict;
use warnings;

use Mojo::DOM;

my $html = <<END;
<div id="innercontent">
<h1>Download here</h1>
<a href="website.pdf"><img src="stuff"></a>
</div>
END

my $dom = Mojo::DOM->new($html);

for my $anchor ( $dom->find('div#innercontent a[href]')->each ) {
    my $href = $anchor->attr('href');
    print "$href\n" if $href =~ /\.pdf\z/i;
}
于 2015-09-11T00:23:14.880 に答える