2009-04-28 53 views
8

当然,可以使用任意数量的python解析器来解析HTML页面,但我很惊讶,似乎没有任何公共解析脚本可以提取来自给定HTML文档的有意义的内容(不包括侧边栏,导航等)。用于从HTML页面提取内容(不包括导航)的python方法

我猜这是收集DIV和P元素,然后检查他们的最小量的文本内容,但我相信一个稳定的实现将包括我没有想到的很多事情。

+1

这个用于Readability书签的JS脚本似乎工作得非常好: http://lab.arc90.com/experiments/readability/js/readability.js – jamtoday 2009-04-28 06:41:09

+0

你是什么意思的“有意义的”?一个程序可以用什么规则来区分“有意义”和应该被排除的东西?这个规则是普遍适用的吗? – 2009-04-28 10:52:50

+0

有意义的,我只是指可读性提取的内容类型。很明显,这在某些网站上不能很好地工作,但我主要是在想要提取最大文本块的博客和新闻网站。 – jamtoday 2009-05-26 02:09:31

回答

5

尝试使用Python的Beautiful Soup库。它具有非常简单的方法来从HTML文件中提取信息。

试图一般地从网页提取数据需要人们以类似的方式编写他们的网页......但是有几乎无数的方式来传达一个看起来相同的页面,更不用说所有必须传达的组合相同的信息。

是否存在您试图提取的特定类型的信息或某个其他最终目标?

您可以尝试提取'div'和'p'标记中的任何内容,并比较页面中所有信息的相对大小。问题在于人们可能会将信息分组为'div'和'p'的集合(或者至少在他们正在编写格式良好的html时会这样做)。如果你形成了一个信息如何相关的树(节点将是'p'或'div或任何其他节点将包含相关文本),你可以做一些分析来确定最小的' p'或'div',它们包含似乎是大部分信息的内容。

[编辑]也许如果你能得到它到树结构中我建议,然后你可以使用类似的计分制度,垃圾邮件刺客。定义一些试图分类信息的规则。一些例子:

+1 points for every 100 words 
+1 points for every child element that has > 100 words 
-1 points if the section name contains the word 'nav' 
-2 points if the section name contains the word 'advert' 

如果你有大量的这加起来当你找到更相关的看着段低的计分规则,我认为这可能演变成一个相当强大的和强大的技术。

[EDIT2]望着可读性,它似乎是在做几乎正是我刚才的提议!也许它可以改进,试图更好地理解表格?

1

什么是有意义的,什么不是,它取决于页面的语义。如果语义蹩脚,你的代码将不会“猜测”什么是有意义的。我使用可读性,您在评论中链接了这些内容,我发现在很多页面上,我尝试阅读它并没有提供任何结果,也没有提及体面的内容。

如果有人把内容放在一张表中,你注定要失败。尝试在phpbb论坛上的可读性,你会明白我的意思。

如果你想这样做,请使用<p></p>的正则表达式,或者解析DOM。

4

看一看TemplateMaker中:http://www.holovaty.com/writing/templatemaker/

它是由Django的的创始人之一写入。基本上你会给它一些示例html文件,它会生成一个“模板”,然后你可以使用它来提取不同的位(通常是有意义的内容)。

下面是来自google code page一个例子:

 

# Import the Template class. 
>>> from templatemaker import Template 

# Create a Template instance. 
>>> t = Template() 

# Learn a Sample String. 
>>> t.learn('<b>this and that</b>') 

# Output the template so far, using the "!" character to mark holes. 
# We've only learned a single string, so the template has no holes. 
>>> t.as_text('!') 
'<b>this and that</b>' 

# Learn another string. The True return value means the template gained 
# at least one hole. 
>>> t.learn('<b>alex and sue</b>') 
True 

# Sure enough, the template now has some holes. 
>>> t.as_text('!') 
'<b>! and !</b>' 
 
3

您可以使用boilerpipe Web application获取和提取的飞行内容。

(这不是特定于Python的,因为您只需向Google AppEngine上的页面发出HTTP GET请求)。

干杯,

基督教

0

Goose仅仅是这个任务的库。引述他们的自述:

鹅会尝试提取以下信息:

    的文章
  • 正文
  • 文章的主要图像
  • 嵌入文章
  • 任何的Youtube/Vimeo的电影
  • 元描述
  • 元标签