繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM