私は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属性のリストを保持する必要がありますか?私はそれが値を格納するのではなく、代わりにそれを指すと信じていますか?
例を探して読んでみましたが、どうやったらいいか分かりません。
ありがとうございました。
あなたのプログラムがどれほど些細なものであれ、必ず「厳密に」使用すべきです。間違いなく、あなたが使用することを選択した「警告を使う」ことが重要です。 – Borodin