提取HTML页面内容(排除导航)的Python方法
当然,HTML页面可以用很多种Python解析器来解析,但我很惊讶的是,似乎没有公开的解析脚本可以从给定的HTML文档中提取有用的内容(不包括侧边栏、导航等)。
我猜这可能是收集一些DIV和P元素,然后检查它们是否有足够的文字内容,但我相信一个好的实现会包含很多我没有想到的东西。
5 个回答
你可以使用boilerpipe网页应用来快速获取和提取内容。
(这并不是Python特有的,因为你只需要向Google AppEngine上的一个页面发送一个HTTP GET请求就可以了。)
祝好,
克里斯蒂安
看看这个工具,叫做templatemaker:http://www.holovaty.com/writing/templatemaker/
这个工具是Django的创始人之一写的。简单来说,你只需要给它几个示例的html文件,它就能生成一个“模板”,你可以用这个模板来提取出不同的部分(通常是一些有意义的内容)。
这里有一个来自谷歌代码页面的例子:
# 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>'
可以试试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'
如果你有很多低分的规则,当你找到更多相关的部分时,这些规则的分数会累加,我觉得这可能会发展成一种相当强大和稳健的技术。
[编辑2]看起来这个可读性工具几乎正好在做我刚才提到的事情!也许可以改进一下,让它更好地理解表格?