2017-06-20 107 views
0

元素中获取HTML我使用WWW::Mechanize在HTML页面中提取特殊链接。使用WWW :: Mechanize

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不知道该文本是<span>元素中。

有什么方法可以获取原始HTML代码而不是剥离文本?

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

+1

不相信'@ links'中的东西我相信。根据该模块的代码(https://metacpan.org/source/OALDERS/WWW-Mechanize-1.84/lib/WWW/Mechanize/Link.pm),他们不知道它们来自哪里。我认为你必须从机械化中抓取整个页面的HTML并使用不同的分析器。 – simbabque

+0

https://metacpan.org/source/OALDERS/WWW-Mechanize-1.84/lib/WWW/Mechanize.pm#L1509是TokeParser的东西变成了WWW :: Mechanize :: Link对象的地方。我不明白你会如何解决这个问题。我建议在'$ mech-> content'中使用不同的解析器。 – simbabque

+0

请提供一个示例HTML页面进行测试。 – Borodin

回答

2

simbabque has said你不能做到这一点与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/\A\s+|\s+\z//g; 
    $text =~ s/\s+/ /g; 

    say $text; 
} 
相关问题