2010-11-19 16 views
1

Web'i şirket yönetim ekipleri için kazımak üzere bir program oluşturmaya çalıştım. Bu da dahil olmak üzere, birçok şeyi elde etmeyi çok hassas:Web Kişi Tanıtımı Açıklamaları

-İş başlıkları

-emails -resimlerinizi -names

-Qualifications (MD, PhD vb) ve Sonekleri (II, III, JR.)

İçinde bulunduğum sorun, kişinin açıklamasının kazımasıdır. Örneğin, Facebook'un Executive Bios sayfasında Mark Zuckerberg'in açıklamasını istiyorum. Bununla birlikte, HTML yapısındaki tüm farklar ile, bunu% 100'e yakın doğrulukla kazımak çok zordur.

Perl ve çok, gelişmiş olduğuna inanıyorum, normal ifadeler kullanıyorum. Soruna yaklaşmak için daha iyi bir yol/araç var mı?

En son denemem, kişilerin tam adının sayfada son olarak bulunmasını bulmak ve daha sonra birlikte çalışanlara isabet edene kadar tüm metni almaktı. Bu işe yarayacak gibi görünüyor olsa da, bana arzu edilen sonuçlardan daha azını veriyor.

DÜZENLEME: Bu soruyu, bu sayfayı ayrıştırmaya çalışıyorum diye ortaya çıktığını fark ettim, herhangi bir şirkette çalışacak kadar genel bir şeye ihtiyacım var "insan sayfası". % 100'lük doğruluk elde edilemediğini biliyorum,% 50-20'ye varan bir şey arıyorum ve şu anda yüzde 15-20 civarındayım.

+2

Aslında, bu sayfa herhangi bir HTML ayrıştırıcısı kullanılarak kazımak için önemsizdir. Tüm bilgiler, farklı sınıf isimleri olan öğelerde bulunur. Tabii ki, HTML'yi ayrıştırmak için normal ifadeler kullanmak genelde hata eğilimli ve sinir bozucu bir görevdir. Yani, bir HTML ayrıştırıcısı kullanın. –

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+0

Evet, bu sayfa üzerinde anlaşılan bir karar var. Herhangi bir sayfada (veya en az% 50-60) çalışın. Sadece gideceğim içeriğin bir örneğini göstermek için facebook sayfasını aldım. – user387049

cevap

4

HTML'yi ayrıştırmak için normal ifadeleri kullanmak kesinlikle bir seferde veya diğerinde başarısız olur. HTML ayrıştırma ile yardımcı olabilecek

Birkaç modüller şunlardır: Eğer ayrıştırma HTML üzerinde daha fazla kontrol gerekiyorsa

, sen HTML::Parser kullanabilirsiniz. Ayrıca, StackOverflow'ta parsing HTML using Perl ile ilgili birkaç soru olmuştur. Cevaplar yardımcı olabilir.

ayrıştırma için sayfa içeriğini ve HTML::TreeBuilder getirmesi LWP::UserAgent yararlanır Facebook Executive Bios sayfa için örnek kazıyıcı,: Asla günümüz teknolojisi ile% 100, ya da değil almak için gidiyoruz

#!/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

Burada "($ p_tag-> content_list()) [0]" ve "$ p_tag-> as_text" arasındaki fark nedir? –

+0

sid_com: 'content_list()', çocuk düğümlerini döndürürken, 'as_text() işlevi, çocuk düğümleri içindeki metni döndürür. Açıkçası, 'as_text()', bu durumda kullanılması gereken yöntemdir. Cevabımı güncelledim. Haber verdiğiniz için teşekkür ederim. –

+1

WWW :: Mechanize, bağlantılar ve resimler dışındaki HTML içeriğini ayrıştırma konusunda yardımcı olmaz. –

1

.

En güvenilir yol, kaynağın işaretlenmesidir, ancak web kazıma yaptığınız için buna sahip değilsiniz. Düzenli ifadelerden ziyade, daha sofistike Doğal Dil İşleme (NLP) tekniklerini deneyebilirsiniz. Perl için neyin uygun olduğunu bilmiyorum ama Python's NLTK başlamak için iyi. İhtiyacınız olan bilgiyi elde etmek için ihtiyacınız olan şeyi seçebilmeniz ve seçebilmeniz için tasarlanmış bir araç takımıdır. Ayrıca, açık kaynaklı O'Reilly kitabı Natural Language Processing with Python da dahil olmak üzere birkaç iyi kitap var.