XPath HTML Treebuilder для извлечения ссылок

Я пишу базовый скрипт, который просто извлекает все ссылки с веб-страницы. Он написан на Perl и использует модули WWW ::Mechanize и HTML ::Treebuilder ::Xpath, которые я установил через CPAN.

Я знаю, что это можно легко сделать, используя только WWW ::Mechanize, однако хотел бы научиться делать это и с помощью XPath.

Таким образом, скрипт будет анализировать всю веб-страницу и проверять атрибут 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? Я считаю, что он не хранит значение, а вместо этого указывает на него?

Я пытался искать и читать примеры, однако я не уверен, как это сделать.

Спасибо.

5
задан cjm 31 July 2012 в 15:13
поделиться