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