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

python方法从HTML页面提取内容(不包括导航),python,html,parsing,semantics,html-content-extraction,Python,Html,Parsing,Semantics,Html Content Extraction,当然,HTML页面可以使用任意数量的python解析器进行解析,但我感到惊讶的是,似乎没有任何公共解析脚本从给定的HTML文档中提取有意义的内容(不包括边栏、导航等) 我猜这就像是收集DIV和p元素,然后检查它们的最小文本内容量,但我相信一个可靠的实现会包含很多我没有想到的东西。什么有意义,什么没有意义,这取决于页面的语义。如果语义很糟糕,代码就不会“猜测”什么是有意义的。我使用了可读性,你在评论中链接到了可读性,我看到在很多页面上,我试图阅读它并没有提供任何结果,更谈不上一个好的结果 如果有人

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


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

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

如果有人把内容放在桌子上,你就完蛋了。在phpbb论坛上试试可读性,你会明白我的意思

如果要执行此操作,请在
上使用regexp,或解析DOM。

尝试Python库。它有非常简单的方法从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]从可读性上看,它似乎完全符合我刚才的建议!也许可以改进一下,以便更好地理解表?

看看templatemaker:

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

以下是来自以下方面的示例:


#导入模板类。
>>>从templatemaker导入模板
#创建一个模板实例。
>>>t=模板()
#学习一个示例字符串。
>>>t.learn(“这个和那个”)
#使用“!”字符标记孔,输出到目前为止的模板。
#我们只学习了一个字符串,所以模板没有漏洞。
>>>t.as_文本(“!”)
“这个和那个”
#学习另一个字符串。真正的返回值表示获得的模板
#至少有一个洞。
>>>t.learn(‘alex和sue’)
真的
#果然,模板现在有一些洞。
>>>t.as_文本(“!”)
'! 而且!”
您可以使用动态获取和提取内容

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

干杯

Christian就是这个任务的图书馆。引用他们的自述:

Goose将尝试提取以下信息:

  • 正文
  • 文章的主要形象
  • 文章中是否嵌入了Youtube/Vimeo电影
  • 元描述
  • 元标记

这个用于Readability bookmarklet的JS脚本似乎工作得出奇地好:你所说的“有意义”是什么意思?程序可以使用什么规则来区分“有意义的”和应该排除的内容?这个规则普遍适用吗?所谓有意义,我只是指可读性提取的内容类型。显然,这在某些类型的网站上不太管用,但我主要关注的是博客和新闻网站,在这些网站上,你想提取最大的文本块。你完全正确,为什么没有用于此的库?这应该是有原因的,因为这个问题很普遍。顺便说一句:你是如何解决你的问题的?如果你看看源代码,你会发现甚至StackOverflow在某些地方也使用表格进行布局!!但它有段文字!!不仅仅是在td,就像糟糕的论坛一样!!没必要大喊大叫!!非常正确,我只是很惊讶如此使用表格进行布局。当然,表格的呈现通常更可靠,但是css和更多的'div'和'p'将是一个更好的可读性解决方案(例如屏幕阅读器在表格上有更多的麻烦)…这就是我的想法,但我仍然感到惊讶的是,没有一个简单的库或BeautifulSoup插件可以为您实现这一点,因为我可以想象,从HTML中提取内容可以在90%以上的时间内使用这些类型的规则……这实际上取决于你在追求什么;我所写的每一个scraper都在寻找大量的小信息片段,而不是更大的文本简介(通常是网站的一般信息)。另外一个有趣的补充:基于javascript的“可读性”脚本也进行内容提取(ot,而不是选择)。它也可以被剥离为想法/算法。虽然它不是完全成功的。第一眼看,这个

# 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>'