3

我不是在谈论 HTML 标签,而是用于描述博客文章、youtube 视频或此站点上的问题的标签。

如果我只抓取一个网站,我只需使用 xpath 来提取标签,如果简单的话,甚至可以使用正则表达式。但我希望能够在我的 extract_tags() 函数中抛出任何网页并列出标签。

我可以想象使用一些简单的启发式方法,例如查找所有具有 id 或“标签”类的 HTML 元素等。但是,这非常脆弱,并且对于大量网页来说可能会失败。你们推荐什么方法来解决这个问题?

另外,我知道 Zemanta 和 Open Calais,它们都有办法猜测一段文本的标签,但这与提取真实人类已经选择的标签并不完全相同。但我仍然很想听听任何其他服务/API 来猜测文档中的标签。

编辑:为了清楚起见,一个已经适用的解决方案会很棒。但我猜没有开源软件已经做到了这一点,所以我真的只是想听听人们关于可能适用于大多数情况的方法。它不需要是完美的。

EDIT2:对于建议通常可行的通用解决方案的人是不可能的,并且我必须为每个网站/引擎编写自定义刮板,请考虑arc90 可读性工具。这个工具能够以惊人的准确性提取网络上任何给定文章的文章文本,使用我相信的某种启发式算法。我还没有深入研究他们的方法,但它适合一个书签,而且似乎并没有太多的参与。我知道提取一篇文章可能比提取标签更简单,但它应该作为一个例子来说明什么是可能的。

4

8 回答 8

2

像 arc90 示例这样的系统通过查看标签/文本比率和其他启发式方法来提供工作。页面的文本内容与周围的广告/菜单等之间存在足够的差异。其他示例包括抓取电子邮件或地址的工具。这里有可以检测的模式,可以识别的位置。在标签的情况下,虽然您没有太多可以帮助您将标签与普通文本区分开来,但它只是一个单词或短语,就像任何其他文本一样。侧边栏中的标签列表很难与导航菜单区分开来。

一些像 tumblr 这样的博客确实有标签,其 url 中有你可以使用的单词“tagged”。Wordpress 同样具有“.../tag/...”类型的标签 URL。像这样的解决方案适用于大量独立于其单独页面布局的博客,但它们不会在任何地方都有效。

于 2010-09-17T19:23:13.623 回答
1

如果源将其数据作为提要 (RSS/Atom) 公开,那么您可能能够从此结构化数据中获取标签(或标签/类别/主题等)。

另一种选择是解析每个网页并查找根据rel=tag 微格式格式化的标签。

于 2010-09-06T11:26:32.473 回答
0

尝试制作一个 Yahoo Pipe 并通过 Term Extractor 模块运行源页面。它可能会或可能不会产生很好的结果,但值得一试。注意 - 启用 V2 引擎。

于 2010-09-16T07:01:31.967 回答
0

Drupal 中有一个术语提取器模块。( http://drupal.org/project/extractor ) 但它仅适用于 Drupal 6。

于 2013-02-19T23:47:42.840 回答
0

看看 arc90,他们似乎也在要求出版商使用语义上有意义的标记 [参见 https://www.readability.com/publishers/guidelines/#view-exampleGuidelines],以便他们可以很容易地解析它,但大概他们必须要么已经开发了通用规则,例如@dunelmtech 建议的标签/文本比率,它可以与文章检测一起使用,要么它们可能与一些文本分割算法(来自自然语言处理领域)组合使用,例如 TextTiler 和 C99对于文章检测可能非常有用 - 请参阅http://morphadorner.northwestern.edu/morphadorner/textsegmenter/和 google 以获取有关两者的更多信息 [发表在学术文献 - 谷歌学者]。

但是,根据您的需要检测“标签”似乎是一个难题(出于上面评论中已经提到的原因)。我会尝试的一种方法是使用其中一种文本分割(C99 或 TextTiler)算法来检测文章的开始/结束,然后查找具有包含 ..tag.. 的 CLASS 和 ID 属性的 DIV's / SPAN's / ULs ,因为就页面布局而言,标签通常位于文章下方和评论提要上方,因此效果可能出奇的好。

无论如何,看看你是否在某个地方进行了标签检测会很有趣。马丁

编辑:我刚刚发现了一些可能真的很有帮助的东西。该算法称为 VIPS [参见:http://www.zjucadcg.cn/dengcai/VIPS/VIPS.html],代表基于视觉的页面分割。它基于页面内容可以在视觉上分成多个部分的想法。与基于 DOM 的方法相比,VIPS 获得的片段在语义上更加聚合。嘈杂的信息,例如导航、广告和装饰,很容易被删除,因为它们通常放置在页面的某些位置。这可以帮助您非常准确地检测标签块!

于 2011-04-03T19:37:16.390 回答
0

This is impossible because there isn't a well know, followed specification. Even different versions of the same engine could create different outputs - hey, using Wordpress a user can create his own markup.

If you're really interested in doing something like this, you should know it's going to be a real time consuming and ongoing project: you're going to create a lib that detects which "engine" is being used in a page, and parse it. If you can't detect a page for some reason, you create new rules to parse and move on.

I know this isn't the answer you're looking for, but I really can't see another option. I'm into Python, so I would use Scrapy for this since it's a complete framework for scraping: it's complete, well documented and really extensible.

于 2010-09-16T01:54:25.020 回答
0

我认为您唯一的选择是为每个站点编写自定义脚本。尽管您可以查看 AlchemyApi,但为了让事情变得更容易。它们具有与 OpenCalais 类似的实体提取功能,但它们也具有“结构化内容抓取”产品,通过使用简单的视觉约束来识别网页的各个部分,这比编写 xpath 更容易。

于 2010-09-14T18:45:32.287 回答
0

该死的,只是要建议 Open Calais。没有“好”的方法可以做到这一点。如果你有一些目标平台,你可以嗅探 Wordpress,然后查看它们的链接结构,然后再查看 Flickr ......

于 2010-09-04T05:53:21.987 回答