用于提取链接的 HTML Treebuilder XPath

标签 html perl xpath html-tree

我正在编写一个基本脚本,它只从网页中提取所有链接。它是用 Perl 编写的,使用了 WWW::Mechanize 和 HTML::Treebuilder::Xpath 模块,这两个模块都是我通过 CPAN 安装的。

我知道只使用 WWW::Mechanize 就可以轻松完成,但是我也想学习使用 XPath 来完成。

因此,脚本将解析整个网页,检查每个 anchor 标记的 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 属性的列表?我相信它不存储值,而是指向它的指针?

我尝试搜索和阅读示例,但我不确定如何去做。

谢谢。

最佳答案

有几个错误。维修:

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

# iterate over array
for my $node (@nodes) {

关于用于提取链接的 HTML Treebuilder XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11740605/

相关文章:

xpath - 寻找 xdmp :value() vs xdmp:eval() 之间的区别

html - 当网站调整为较小的宽度时,我在图像上的 href 标签不起作用

html - 如何使用CSS更改输入内图标的大小?

javascript - 如何制作:hover appearance remain after click/focus in search bar

perl - 为什么要在 Perl 中导出符号?

regex - 如何更改正则表达式以读取 UTF-8?

Perl 在使用空 substr 调用时 index() 的奇怪行为与不使用 Encode::decode()

xslt - 在 xpath 中连接两个字符串序列

xml - 如果双斜杠 (//) 在 XPath 中使用了 2 次,那是什么意思?

html - 表格在 IE7 中无法正确调整大小