2009-12-30 45 views
1

我正在解析HTML获取匹配特定网址(我们称之为“目标网址”)的所有href,然后获取锚文本。我试过LinkExtractor,TokenParser,Mechanize,TreeBuilder模块。对于以下HTML:如何提取包含在Perl中的锚中的HTML img标签?

<a href="target_url"> 
<img src=somepath/nw.gf alt="Open this result in new window"> 
</a> 

所有这些都将“在新窗口中打开此结果”作为定位文本。 理想情况下,我希望看到空白值或返回的“图像”字符串,以便我知道没有锚文本,但href仍与目标网址匹配(在此情况下为http://www.yahoo.com) 。有没有办法使用其他模块或Perl正则表达式来获得所需的结果?

谢谢,

+0

我编辑了你的帖子,以显示我认为你想说的话。请显示您尝试解析的确切HTML。除了将其纳入问题之外,不要以任何其他方式进行编辑。 – 2009-12-31 08:32:38

回答

3

你应该张贴一些例子,你有试过“LinkExtractor,TokenParser,机械化& TreeBuilder作为”,使我们可以帮助你。

这里有一些东西,在pQuery工作对我来说:

use pQuery; 

my $data = ' 
    <html> 
    <a href="http://www.something.com">Not yahoo anchor text</a> 
    <a href="http://www.yahoo.com"><img src="somepath/nw.gif" alt="Open this result in new window"></img></a> 
    <a href="http://www.yahoo.com">just text for yahoo</a> 
    <a href="http://www.yahoo.com">anchor text only<img src="blah" alt="alt text"/></a> 
    </html> 
'; 

pQuery($data)->find('a')->each(
    sub { 
     say $_->innerHTML 
      if $_->getAttribute('href') eq 'http://www.yahoo.com'; 
    } 
); 

# produces: 
# 
# => <img alt="Open this result in new window" src="somepath/nw.gif"></img> 
# => just text for yahoo 
# => anchor text only<img /="/" alt="alt text" src="blah"></img> 
# 

如果你只是想要的文字:

pQuery($data)->find('a')->each(
    sub { 
     return unless $_->getAttribute('href') eq 'http://www.yahoo.com'; 

     if (my $text = pQuery($_)->text) { say $text } 
    } 
); 

# produces: 
# 
# => just text for yahoo 
# => anchor text only 
# 

/I3az/

+0

添加了一个我试过的脚本作为答案。 – user241126 2009-12-30 22:31:58

+0

当我运行上面的pquery脚本时,为什么我看不到任何输出? – user241126 2009-12-30 22:49:40

+0

你有没有得到任何错误? NB。对于'说'你需要perl 5.10。*或Perl6 :: Say模块。 – draegtun 2009-12-30 23:16:29

1

使用适当的分析器(如HTML :: Parser或HTML :: TreeBuilder)。使用正则表达式来解析SGML(包括HTML/XML)并不是真正有效的,因为有趣的多行标签和属性就像您遇到的那样。

0

如果您正在使用的HTML与格式相当接近,您通常可以将其加载到支持HTML的XML模块中,并使用它来从您感兴趣的文档的各个部分查找和提取数据。 我选择的方法是XML :: LibXML和XPath。

use XML::LibXML; 

my $parser = XML::LibXML->new(); 
my $html = ...; 
my $doc = $parser->parse_html_string($html); 

my @links = $doc->findnodes('//a[@href = "http://example.com"]'); 
for my $node (@links) { 
    say $node->textContent(); 
} 

传递给findnodes的字符串是一个XPath表达式查找具有href属性$ DOC的所有“一”元素子孙等于“http://example.com”。

相关问题