我试图建立一个程序来为公司管理团队抓取网页。获得很多东西非常准确,包括:
-names
-job titles
-images
-emails
-Qualifications(MD,PhD,ect)和Suffixes(II,III,JR。)
我遇到的问题是抓住这个人的描述。例如,在Facebook的Executive Bios页面上,我想要Mark Zuckerberg的描述。但是,由于HTML结构存在所有差异,因此很难以接近100%的准确率进行搜索。
我正在使用Perl和许多我认为是高级的正则表达式。是否有更好的方法/工具来解决问题?
我最近的尝试是在页面上找到最后一次出现的人名,然后取出所有文字,直到我找到一个同事的名字。虽然这似乎可行,但它给我的结果不太理想。
编辑:我意识到这个问题只是试图解析这个特定的页面,我需要的东西足够通用,可以在任何公司“人物页面”上工作。我知道100%的准确度是无法实现的,寻找能让我达到50%以上的东西,因为目前我的成绩下降了15-20%。答案 0 :(得分: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";
}
答案 1 :(得分:1)
你永远不会得到100%,或者没有得到今天的技术。
最可靠的方法是将标记作为源代码,但是当你正在进行网络抓取时,你没有这个。 您可以尝试更复杂的自然语言处理(NLP)技术,而不是正则表达式。我不知道Perl可用的是什么,但Python's NLTK对于入门很有用。它是一个专门设计的工具包,您可以选择所需的内容来提取所需的信息,此外还有一些好书 - 包括开源的O'Reilly书籍Natural Language Processing with Python。