标签: html-tree

在HTML :: Element的look_down例程Perl中指定多个类?

我正在使用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 for-loop class html-tree

5
推荐指数
1
解决办法
1812
查看次数

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');
}
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 perl xpath html-tree

5
推荐指数
1
解决办法
4237
查看次数

如何使用HTML :: TreeBuilder找到直接后代?

假设我有一个像这样的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个例子).

html perl parsing html-tree

4
推荐指数
2
解决办法
2136
查看次数

如何在使用HTML :: Tree解析后将数据标记为UTF-8?

我写了一个脚本,我在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)

perl utf-8 html-parsing html-tree

0
推荐指数
1
解决办法
719
查看次数

标签 统计

html-tree ×4

perl ×4

html ×2

class ×1

for-loop ×1

html-parsing ×1

parsing ×1

utf-8 ×1

xpath ×1