我正在使用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::UserAgent
。 WWW::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;
}