2010-07-24 153 views
2

大任务:我正在尝试获取网页摘要的几行内容。即我想有一个函数可以接收一个URL并返回该页面中最具信息量的段落。 (这通常是实际内容文本的第一段,与导航栏等“垃圾文本”形成鲜明对比)。Python:检测字符串中的实际文本段落

因此,我设法通过删除标签来将HTML页面缩减为一堆文本,扔出<HEAD>和所有脚本。但有些文字仍然是“垃圾文字”。我想知道文本的实际段落在哪里开始。 (理想情况下,它应该与人类语言无关,但如果您只有英文解决方案,这可能也有帮助。)

如何确定哪些文本是“垃圾文本”,哪一个是实际内容?

更新:我看到一些人指出我使用HTML解析库。我正在使用美丽的汤。我的问题是不解析HTML;我已经摆脱了所有的HTML标签,我只是有一堆文本,我想分离文本和垃圾文本。

+1

你能后你有文本的样本?你想要它成为什么?关于用正则表达式解析HTML - 强制性链接 - http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – Oded 2010-07-24 16:18:13

+0

这是一个来自网页:http://cool-rr.com/sample_text.delete_me.txt它恰好是来自Python文档的页面。 – 2010-07-24 16:41:16

+0

我删除了'[regex]'标签,因为它似乎在欺骗人们认为你想用正则表达式从页面中提取文本,但这不是你的问题。这实际上是一个文本处理问题。它几乎没有任何与HTML有关的事情;从网页中提取文本的事实并不重要,除非您希望尝试使用HTML标记来帮助您识别重要的文本片段。 – 2010-07-24 18:39:18

回答

1

该问题的一般解决方案是要解决的不平凡问题。

为了说明这一点,Google搜索的很大一部分成功源于他们能够自动识别任意网页的某些语义,即找出“内容”的位置。

想到的一个想法是,如果您可以从同一网站抓取很多网页,那么您将能够识别模式。菜单标记在所有页面上基本相同。如果你以某种方式将其归零(并且需要相当“模糊”),剩下的就是内容。

下一步将确定文本和构成边界的内容。理想情况下,这将是一些HTML段落,但你大部分时间都不会那么幸运。

更好的方法可能是找到该站点的RSS源并以这种方式获取内容,因为该内容将按原样被删除。忽略任何AdSense(或类似)内容,您应该能够获取文本。

哦,绝对丢掉你的正则表达式代码。这绝对不需要HTML解析器。

+1

Cletus,HTML是一个非问题。标签不关心我,我把它们都扔掉了。 我正在考虑正则表达式的原因是用它来告诉哪些文本段落正在流动,哪些是来自导航栏的链接文本(或其他小段文本)。 – 2010-07-24 16:47:23

1

可能有些矫枉过正,但你可以试试nltk,自然语言工具包。该库用于解析自然语言。这是一个不错的图书馆和一个有趣的主题。如果您想刚刚从你会做类似文本得到的句子:

>>> import nltk 
>>> nltk.sent_tokenize("Hi this is a sentence. And isn't this a second one, a sentence with a url http://www.google.com in it?") 
['Hi this is a sentence.', "And isn't this a second one, a sentence with a url http://www.google.com in it?"] 

或者你可以使用从PunktSentenceTokenizersentences_from_text方法。在开始之前,您必须先做nltk.download()

0

我建议看看Readability做什么。可读性除去页面的实际内容,并将其重新排列以方便阅读。在从我的经验中检测内容方面,它似乎工作得很好。

看看它的source code(特别是grabArticle功能),也许你可以得到一些想法。