如何在 Perl 中从 HTML 中提取 URL 标签和链接文本?



我有一个页面包含以下内容:

<a href="http://www.trial.com" title="yellow">Trial</a>
<a href="http://www.trial1.com" title="red">Trial2</a>

如何获取锚文本、URL 和标题?

我想有这个输出:

Trial, http://www.trial.com, yellow
Trial2, http://www.trial1.com, red

我尝试使用WWW::Mechanize,正如这里所解释的那样,但我不知道如何以这种方式获得标题。你有什么想法吗?

基于您的问题的简单版本

  • 一个看起来像你的页面(所以没有晦涩难懂的HTML会搞砸(
  • TE 期望的输出

这可能是您要查找的内容:

use strict;
use warnings;
use WWW::Mechanize;
my $mech = WWW::Mechanize->new;
$mech->get('file:page.html');
foreach my $link ($mech->links) {
my $text  = $link->text;
my $url   = $link->url;
my $title = $link->attrs->{title};
print "$text, $url, $titlen"
}

快乐编码,蒂姆托维迪

使用您的问题中提供的文档。我相信我创造了一些可以解决你问题的东西。显然,使用 https://www.perlmonks.org 有一些异常值,因为有些 URL 不是完整的 URL,但如果它不是您想要的,则进行一些简单的检查和跳过,我认为您会得到您想要的。

示例输出

_____________________________________________________________________________________________________________________________
| Text                                            | URL                | Attributes
_____________________________________________________________________________________________________________________________
| Testing a metacpan dist with XS components      | ?node_id=1216149   | [name]post-head-id1216149[id]post-head-id1216149,  |
| Controlling the count in array                  | ?node_id=1216134   | [name]post-head-id1216134[id]post-head-id1216134,  |

很可能你被哈希文献难住了。您只需要创建一个 for 循环来遍历这些循环以获取属性标签及其值。

法典:

#!/usr/bin/perl
# your code goes here
use strict;
use warnings;
use Data::Dumper;
use WWW::Mechanize ();
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
my @urls = (
q{https://www.perlmonks.org/}
);
my $mech = WWW::Mechanize->new();
$mech->get(@urls);
my @links = $mech->links();
print qq{______________________________________________________________________________________________________________n};
printf(qq{| %-65s | %-75s | %-25sn},q{Text},q{URL},q{Attributes});
print qq{______________________________________________________________________________________________________________n};
foreach my $link (@links) {
if ($link->text() && $link->url()) {
my $a;
foreach my $attr (keys %{$link->attrs()}) {
next if $attr =~ m/href/i;
#$link->attr()->{$attr} is the value of the key in this hashref. 
$a .= qq{[$attr]} . $link->attrs()->{$attr};
}
my $info;
if ($a) {
$info = sprintf(qq{| %-65s | %-75s | %-25s, },$link->text(),$link->url(),$a);
} else {
$info = sprintf(qq{| %-65s | %-75s |},$link->text(),$link->url());
}
print $info . qq{ |n};
}
}

相关内容

  • 没有找到相关文章

最新更新