我之前曾在Groovy中询问过如何做到这一点.但是,由于所有CPAN库,现在我在Perl中重写我的应用程序.
如果页面包含以下链接:
Google Apple
输出将是:
Google, http://www.google.com Apple, http://www.apple.com
在Perl中执行此操作的最佳方法是什么?
请看一下使用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; }
非常简单,如果您希望导航到该页面上的其他URL,它甚至更简单.
Mech基本上是对象中的浏览器.
看看HTML :: LinkExtractor和HTML :: LinkExtor,HTML :: Parser包的一部分.
HTML :: LinkExtractor类似于HTML :: LinkExtor,除了获取URL之外,您还可以获得链接文本.
我喜欢用pQuery这样的东西......
use pQuery; pQuery( 'http://www.perlbuzz.com' )->find( 'a' )->each( sub { say $_->innerHTML . q{, } . $_->getAttribute( 'href' ); } );
另请查看此前的stackoverflow.com问题仿真lex,如Perl或Python中的功能,以获得类似的答案.
如果您喜欢冒险并且想要在没有模块的情况下尝试,那么这样的事情应该有效(根据您的需求进行调整):
#!/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(//,@content); foreach my $c (@links){ $c =~ / /; $link = $1; $c =~ / ([\s\S]+?)<\/a>/; $title = $1; print "$title, $link\n"; }
我可能在这里做了一些错误的事情,但它在我写完之后试过的一些测试用例中起作用(它没有考虑像标签之类的东西等).
另一种方法是使用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'); }