5

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

WWW::Mechanize だけを使用して簡単に実行できることはわかっていますが、XPath を使用して実行することも学びたいと考えています。

そのため、スクリプトは Web ページ全体を解析し、すべてのアンカー タグの href 属性をチェックし、リンクを抽出してコンソールに出力/ファイルに書き込みます。以下のスクリプトでは use strict を使用していないことに注意してください。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 属性のリストを保持する必要がありますか? 値を格納するのではなく、値へのポインタを格納すると思いますか?

例を検索して読んでみましたが、どうすればよいかわかりません。

ありがとう。

4

1 に答える 1

4

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

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

# iterate over array
for my $node (@nodes) {
于 2012-07-31T13:07:55.337 に答える