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

20 html url perl parsing cpan

我之前曾在Groovy中询问过如何做到这一点.但是,由于所有CPAN库,现在我在Perl中重写我的应用程序.

如果页面包含以下链接:

<a href="http://www.google.com">Google</a>

<a href="http://www.apple.com">Apple</a>

输出将是:

Google, http://www.google.com
Apple, http://www.apple.com

在Perl中执行此操作的最佳方法是什么?

And*_*ter 40

请看一下使用WWW :: Mechanize模块.它将为您提取您的网页,然后让您轻松使用URL列表.

my $mech = WWW::Mechanize->new();
$mech->get( $some_url );
my @links = $mech->links();
for my $link ( @links ) {
    printf "%s, %s\n", $link->text, $link->url;
}
Run Code Online (Sandbox Code Playgroud)

非常简单,如果您希望导航到该页面上的其他URL,它甚至更简单.

Mech基本上是对象中的浏览器.

  • 我冒昧地改变了print语句,包含了melling所要求的链接文本. (2认同)

She*_*ley 11

看看HTML :: LinkExtractorHTML :: LinkExtor,HTML :: Parser包的一部分.

HTML :: LinkExtractor类似于HTML :: LinkExtor,除了获取URL之外,您还可以获得链接文本.


dra*_*tun 6

我喜欢用pQuery这样的东西......

use pQuery;

pQuery( 'http://www.perlbuzz.com' )->find( 'a' )->each(
    sub {
        say $_->innerHTML . q{, } . $_->getAttribute( 'href' );
    }
);
Run Code Online (Sandbox Code Playgroud)

另请查看此前的stackoverflow.com问题仿真lex,如Perl或Python中的功能,以获得类似的答案.


小智 6

如果您喜欢冒险并且想要在没有模块的情况下尝试,那么这样的事情应该有效(根据您的需求进行调整):

#!/usr/bin/perl

if($#ARGV < 0) {
  print "$0: Need URL argument.\n";
  exit 1;
}

my @content = split(/\n/,`wget -qO- $ARGV[0]`);
my @links = grep(/<a.*href=.*>/,@content);

foreach my $c (@links){
  $c =~ /<a.*href="([\s\S]+?)".*>/;
  $link = $1;
  $c =~ /<a.*href.*>([\s\S]+?)<\/a>/;
  $title = $1;
  print "$title, $link\n";
}
Run Code Online (Sandbox Code Playgroud)

我可能在这里做了一些错误的事情,但它在我写完之后试过的一些测试用例中起作用(它没有考虑像<img>标签之类的东西等).


Ale*_*nii 5

另一种方法是使用XPath查询已解析的HTML.在复杂的情况下需要它,比如使用特定的类提取div中的所有链接.为此使用HTML :: TreeBuilder :: XPath.

  my $tree=HTML::TreeBuilder::XPath->new_from_content($c);
  my $nodes=$tree->findnodes(q{//map[@name='map1']/area});
  while (my $node=$nodes->shift) {
    my $t=$node->attr('title');
  }
Run Code Online (Sandbox Code Playgroud)

  • 另外,添加$ tree-> delete以避免内存泄漏. (2认同)