2012-07-31 13 views
5

私はWebページからすべてのリンクを抽出する基本的なスクリプトを書いています。これはPerlで書かれており、WWAN :: MechanizeとHTML :: Treebuilder :: Xpathモ​​ジュールを利用しています。どちらもCPAN経由でインストールしています。HTML Treebuilderリンクを抽出するXPath

私はそれがWWW :: Mechanizeだけを使って簡単に行うことができますが、XPathを使用してそれを行う方法も学びたいと思います。

スクリプトはWebページ全体を解析し、すべてのアンカータグのhref属性をチェックし、リンクを抽出してコンソールに出力したり、ファイルに書き込んだりします。以下のスクリプトでは、厳密にuseを使用していないことに注意してください。これは、XPathを使用してHTMLツリーをトラバースするという概念を明確に理解するためのものです。ここ

はスクリプトです:

#! /usr/bin/perl 

use WWW::Mechanize; 
use HTML::TreeBuilder::XPath; 
use warnings; 

$url="https://example.com"; 

$mech=WWW::Mechanize->new(); 
$mech->get($url); 

$tree=HTML::TreeBuilder::XPath->new(); 

$tree->parse($mech->content); 

$nodes=$tree->findnodes(q{'//a'}); # line is modified later. 

foreach $node($nodes) 
{ 
    print $node->attr('href'); 
} 

そして、それはエラーを与える:

Can't locate object method "attr" via package "XML::XPathEngine::Literal" at pagegetter.pl line 23. 

次のように私は、スクリプトを変更した:

$nodes=$tree->findnodes(q{'//a/@href'}); 

while($node=$nodes->shift) 
{ 
    print $node->attr('href'); 
} 

エラー:

Can't locate object method "shift" via package "XML::XPathEngine::Literal" 

href属性の値を出力する方法がわかりません。

$ nodesはすべてのhref属性のリストを保持する必要がありますか?私はそれが値を格納するのではなく、代わりにそれを指すと信じていますか?

例を探して読んでみましたが、どうやったらいいか分かりません。

ありがとうございました。

+0

あなたのプログラムがどれほど些細なものであれ、必ず「厳密に」使用すべきです。間違いなく、あなたが使用することを選択した「警告を使う」ことが重要です。 – Borodin

答えて

4

いくつかの間違いがあります。修理:

# list context 
my @nodes = $tree->findnodes(
    q{//a}  # just a string, not a string containings quotes 
); 

# iterate over array 
for my $node (@nodes) { 
+0

'href'属性を持つすべてのアンカー要素を見つけるには、XPathの' // a [@href] 'を使うべきです。 – Borodin

+0

ありがとう。同意しましたが、Forループ内に正確に何を印刷しますか?そして、はい、私はリンクを抽出したいですか? –

+0

@ NeonFlash:残りのコードはそのままです。 \ n "' – Borodin

関連する問題