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) {