2010-11-19 49 views
1

我試圖建立一個程序來爲公司管理團隊刮網。這是非常準確的,在獲得很多事情,包括:個人網頁抓取描述

-names

-job冠軍

-images

-emails

-Qualifications(博士,ECT)和後綴(二,三,JR。)

我遇到的問題是刮人的描述。例如在Facebook的Executive Bios頁面上,我希望馬克扎克伯格的描述。但是,由於HTML結構有所不同,要以近乎100%的準確度來完成這一點非常困難。

我使用Perl和許多,我相信是先進的,正則表達式。有沒有更好的方法/工具來解決這個問題?

我最近的一次嘗試是在頁面上找到最後一次出現的人的全名,然後取所有文字,直到我找到同事的名字。雖然這看起來可能會起作用,但它給我的結果並不理想。

編輯:我意識到這個問題,因爲只是試圖解析這個特定的頁面,我需要的是一般足以在任何公司「人物頁面」上工作的東西。我知道100%的準確性是無法實現的,尋找一些能讓我達到50%的東西,因爲目前我下降了15-20%左右。

+2

實際上,該頁面使用任何HTML解析器都是微不足道的。所有信息都包含在具有不同類名的元素中。當然,使用正則表達式來解析HTML通常是一個容易出錯和令人沮喪的任務。所以,使用一個HTML解析器。 – 2010-11-19 14:17:26

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – 2010-11-19 15:22:48

+0

是的這個頁面是微不足道的同意,我需要的東西是足夠一般在任何頁面上工作(或至少50-60%)。我只是抓住了Facebook頁面來展示我要去的內容的一個例子。 – user387049 2010-11-19 17:47:52

回答

4

使用正則表達式解析HTML一定會失敗。

幾個模塊可與解析HTML幫助是:

如果您需要在解析HTML更多的控制,你可以使用HTML::Parser

此外,StackOverflow中的parsing HTML using Perl還有幾個問題。那裏的答案可能會有所幫助。

樣本刮刀爲Facebook Executive Bios頁面,這使得使用LWP::UserAgent來解析抓取頁面內容和HTML::TreeBuilder

#!/usr/bin/env perl 

use strict; 
use warnings; 

use LWP::UserAgent; 
use HTML::TreeBuilder; 

binmode STDOUT, ':utf8'; 

my $ua = LWP::UserAgent->new('agent' => 'Mozilla'); 
my $response = $ua->get('http://www.facebook.com/press/info.php?execbios'); 

my $tree = HTML::TreeBuilder->new(); 
if ($response->is_success()) { 
    $tree->parse_content($response->decoded_content()); 
} 
else { 
    die $response->status_line(); 
} 

for my $biosummary_tag ($tree->look_down('class' => 'biosummary')) { 
    my $bioname_tag = $biosummary_tag->look_down('class' => 'bioname' ); 
    my $biotitle_tag = $biosummary_tag->look_down('class' => 'biotitle'); 
    my $biodescription_tag 
     = $biosummary_tag->look_down('class' => 'biodescription'); 

    my $bioname  = $bioname_tag->as_text(); 
    my $biotitle  = $biotitle_tag->as_text(); 
    my $biodescription = $biodescription_tag->as_text(); 

    print "Name:  $bioname\n"; 
    print "Title:  $biotitle\n"; 
    print "Description: $biodescription\n\n"; 
} 
+0

「($ p_tag-> content_list())[0]」和「$ p_tag-> as_text」之間的區別是什麼? – 2010-11-19 15:22:40

+0

sid_com:'content_list()'返回子節點,而'as_text()'返回子節點內的文本。顯然,'as_text()'是在這種情況下應該使用的方法。我已經更新了我的答案。感謝您的注意。 – 2010-11-19 16:18:13

+1

WWW :: Mechanize不會幫助解析HTML內容,而不是鏈接和圖像。 – 2010-11-19 17:45:13

1

你永遠不會得到100%的,或不符合今天的技術。

最可靠的方法是將標記作爲源代碼,但是由於您是網頁抓取,因此您沒有這個功能。 而不是正則表達式,你可以嘗試一些更復雜的自然語言處理(NLP)技術。我不知道Perl有什麼可用,但Python's NLTK適合入門。它是一個工具箱,可以選擇你需要的信息來提取你需要的信息,此外還有一些好書 - 包括開源的O'Reilly書Natural Language Processing with Python