我正在使用HTML :: TreeBuilder来解析一些HTML.
你能在' look_down '例程中指定多个类吗?
在使用以下方式搜索HTML时的情况 -
for ( $tree->look_down( 'class' => 'postbody'))
Run Code Online (Sandbox Code Playgroud)
我也是'postprofile'在同一个循环中搜索另一个类.
有没有办法这样做而不必使用新的 - for ( $tree->look_down( 'class' => 'postprofile' ))
因为这会带回2组结果,而我只想要一个合并集.
我尝试过使用 - for ( $tree->look_down( 'class' => 'postbody||postprofile'))
但这不起作用,
先感谢您.
我正在编写一个基本脚本,它只是从网页中提取所有链接.它是用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');
}
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误:
Can't locate object method "attr" via package "XML::XPathEngine::Literal" at pagegetter.pl line 23.
Run Code Online (Sandbox Code Playgroud)
我修改了脚本如下:
$nodes=$tree->findnodes(q{'//a/@href'});
while($node=$nodes->shift)
{
print $node->attr('href');
}
Run Code Online (Sandbox Code Playgroud)
错误:
Can't locate object method "shift" via package "XML::XPathEngine::Literal"
Run Code Online (Sandbox Code Playgroud)
我不确定,如何打印href属性的值.
$ nodes应该包含所有href属性的列表?我相信它不存储价值,而是指向它?
我尝试搜索和阅读示例,但我不知道如何去做.
谢谢.
假设我有一个像这样的HTML树:
div
`- ul
`- li (*)
`- li (*)
`- li (*)
`- li (*)
`- ul
`- li
`- li
`- li
Run Code Online (Sandbox Code Playgroud)
如何选择<li>标有的元素(*)?它们是第一个<ul>元素的直接后代.
以下是我找到第一个<ul>元素的方法:
my $ul = $div->look_down(_tag => 'ul');
Run Code Online (Sandbox Code Playgroud)
现在我有了$ul,但是当我做的事情如下:
my @li_elements = $ul->look_down(_tag => 'li');
Run Code Online (Sandbox Code Playgroud)
它还会找到<li>隐藏在HTML树中更深层的元素.
我如何找到<li>第一个<ul>元素的直接后代的元素?我的数量不详.(我不能只选择前4个例子).
我写了一个脚本,我在UTF-8编码的HTML文件中啜饮,然后将其解析为树HTML::Tree.问题是解析后的字符串不再标记为UTF-8.
由于_utf8_on()不建议设置标志的方式,我正在寻找正确的方法.
我的简化代码示例:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
use utf8::all;
use autodie;
use HTML::Tree;
use Encode qw/is_utf8/;
my $file = shift;
my $tree;
if ($file) {
my $content = slurp_in( 'file' => $file );
$tree = html_tree('content' => $content);
} else {
die "no file";
}
my $title = $tree->look_down(_tag => 'title');
$title = $title->as_HTML('');
if ( is_utf8( $title ) ) {
say "OK: $title";
} else {
say "NOT OK: $title";
}
## …Run Code Online (Sandbox Code Playgroud)