<a> 使用 WWW::Mechanize 获取元素中的 HTML



我正在使用WWW::Mechanize提取HTML页面中的特殊链接。

my $mech = WWW::Mechanize->new();
$mech->get( $uri );
my @links = $mech->find_all_links(url_regex => qr/cgi-bin/);
for my $link ( @links ) {
    # try to get everything between <a href="[...]">HERE</a>
}

链接如下所示

<a href="[...]"><div><div><span>foo bar</span> I WANT THIS TEXT</div></div></a>

通过使用$link->text,我在不知道<span>元素内是哪个文本的情况下获得foo bar I WANT THIS TEXT

有没有办法获取原始HTML代码而不是剥离的文本?

换句话说,我需要找到一种方法来只获得I WANT THIS TEXT,而不知道<span>标签中的确切文本。

正如辛巴布克所说,你不能用WWW::Mechanize做到这一点

事实上,如果你不想要它的任何功能,那么使用WWW::Mechanize就没有什么意义了。如果您使用它只是获取网页,请改用LWP::UserAgentWWW::Mechanize只是LWP::UserAgent的一个子类,其中包含许多您不想要的额外内容

下面是一个示例,它使用 HTML::TreeBuilder 构造 HTML 的分析树并找到所需的链接。我使用过HTML::TreeBuilder因为它非常擅长以类似于现代浏览器的方式容忍格式错误的 HTML

我一直无法测试它,因为您没有提供适当的样本数据,而且我不倾向于创建自己的样本数据

use strict;
use warnings 'all';
use feature 'say';
use WWW::Mechanize;
use HTML::TreeBuilder;
my $mech = WWW::Mechanize->new;
$mech->get('http://www.example.com/');
my $tree = HTML::TreeBuilder->new_from_content($mech->content);
for my $link ( @{ $tree->extract_links('a') } ) {
    my ($href, $elem, $attr, $tag) = @$link;
    # Exclude non-CGI links
    next unless $link =~ /cgi-bin/;
    # Find all immediate child text nodes and concatenate them
    # References are non-text children
    my $text = join ' ', grep { not ref } $elem->content_list;
    next unless $text =~ /S/;
    # Trim and consolidate spaces
    $text =~ s/As+|s+z//g;
    $text =~ s/s+/ /g;
    say $text;
}

最新更新