【问题标题】:Web Scraping of Person Descriptions人物描述的网页抓取
【发布时间】:2010-11-19 14:10:23
【问题描述】:

我尝试构建一个程序来为公司管理团队抓取网络。它在获取许多东西方面非常准确,包括:

-名字

-职称

-图片

-电子邮件

-资格(MD、PhD等)和后缀(II、III、JR。)

我遇到的问题是抓取此人的描述。例如,在 Facebook 的 Executive Bios 页面上,我想要 Mark Zuckerberg 的描述。然而,由于 HTML 结构的所有差异,很难以接近 100% 的准确率来抓取它。

我正在使用 Perl 和许多我认为是高级的正则表达式。有没有更好的方法/工具来解决这个问题?

我最近的尝试是在页面上查找人员全名的最后一次出现,然后获取所有文本,直到我找到同事的名字。虽然这似乎可行,但它给我的结果并不理想。

编辑:我意识到这个问题只是试图解析这个特定页面,我需要一些足够通用的东西来处理任何公司的“人员页面”。我知道 100% 的准确率是无法实现的,正在寻找可以让我达到 50% 以上的东西,因为目前我的准确率下降了大约 15-20%。

【问题讨论】:

  • 实际上,使用任何 HTML 解析器来抓取该页面都是微不足道的。所有信息都包含在具有不同类名的元素中。当然,使用正则表达式解析 HTML 通常是一个容易出错且令人沮丧的任务。因此,请使用 HTML 解析器。
  • 是的,这个页面是微不足道的,我需要一些足够通用的东西来在任何页面上工作(或至少 50-60%)。我刚刚抓取了 facebook 页面来展示我想要的内容示例。
  • 你永远找不到一个“足够通用,可以在任何页面上工作”的正则表达式。
  • @Ether 那么是否有任何其他方法可以通用到足以处理 50-60% 的页面?

标签: regex perl web-scraping


【解决方案1】:

使用正则表达式解析 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";
}

【讨论】:

  • "( $p_tag->content_list() )[0]" 和 "$p_tag->as_text" 有什么区别?
  • sid_com: content_list() 返回子节点,而 as_text() 返回子节点内的文本。显然,as_text() 是在这种情况下应该使用的方法。我已经更新了我的答案。感谢您的关注。
  • WWW::Mechanize 不会帮助解析 HTML 内容,除了链接和图像。
  • 这对于这个特定的 url 来说非常有用,但我需要更通用的东西,几乎可以在任何网站上使用。显然,我永远无法达到 100%,但即使是一些可以让我正确描述 50% 或 60% 的方法也会很棒。
  • user387049:我希望你能从上面的例子中学习,并为你的特定 URL 编写自己的爬虫。否则,请告诉我们您在哪里需要帮助。
【解决方案2】:

你永远不会得到 100%,或者没有今天的技术。

最可靠的方法是标记源,但是当您进行网络抓取时,您没有这个。 除了正则表达式,您还可以尝试一些更复杂的自然语言处理 (NLP) 技术。我不知道 Perl 有什么可用的,但 Python's NLTK 非常适合入门。它是一个专门设计的工具包,因此您可以选择提取所需信息所需的内容,此外还有几本好书 - 包括开源的 O'Reilly 书籍Natural Language Processing with Python

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 2022-12-01
    • 1970-01-01
    • 2021-05-29
    • 2021-02-20
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多