用于从HTML页面中提取内容(不包括导航)的python方法

时间:2009-04-28 06:40:29

标签: python html parsing semantics html-content-extraction

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

我猜这有点像收集DIV和P元素,然后检查它们是否有最少量的文本内容,但我确信一个可靠的实现会包含很多我没想过的东西。

5 个答案:

答案 0 :(得分: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 :(得分: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>'

答案 2 :(得分:3)

您可以使用boilerpipe Web application动态获取和提取内容。

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

干杯,

基督教

答案 3 :(得分:1)

什么是有意义的,什么不是,它取决于页面的语义。如果语义很糟糕,你的代码就不会“猜测”什么是有意义的。我使用了你在评论中链接的可读性,我看到在很多页面上我尝试阅读它并没有提供任何结果,也没有提到一个体面的结果。

如果有人将内容放在表格中,那你就注定要失败。尝试在phpbb论坛上阅读,你会明白我的意思。

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

答案 4 :(得分:0)

Goose只是此任务的库。引用自述文件:

  

Goose将尝试提取以下信息:

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