[英]Get HTML within an <a> element using WWW::Mechanize
我正在使用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
我得到了foo bar I WANT THIS TEXT
此文foo bar I WANT THIS TEXT
而又不知道<span>
元素内的文本。
有没有办法获取原始HTML代码而不是剥离的文本?
换句话说,我需要找到一种方法,仅在不知道<span>
标记内的确切文本的情况下获得I WANT THIS TEXT
的文本。
正如辛巴克所说,您不能使用WWW::Mechanize
做到这一点
实际上,如果您不希望使用WWW::Mechanize
任何功能,则没有什么意义。 如果您仅使用它来获取网页,则使用LWP::UserAgent
。 WWW::Mechanize
只是LWP::UserAgent
的子类,其中包含许多您不想要的其他内容
这是一个使用HTML::TreeBuilder
构造HTML::TreeBuilder
的解析树并找到所需链接的示例。 我使用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/\A\s+|\s+\z//g;
$text =~ s/\s+/ /g;
say $text;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.