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

Я пишу основной скрипт, который просто извлекает все ссылки с веб-страницы. Он написан на 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.

$ node должен содержать список всех атрибутов href? Я считаю, что это не хранит значение, а вместо этого указатели на него?

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

Благодарю.

1 ответ

Решение

Есть пара ошибок. Ремонт:

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

# iterate over array
for my $node (@nodes) {
Другие вопросы по тегам