2009-12-30 43 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」。

相關問題