Python:检测字符串中的实际文本段落
我的大目标是:我想从一个网页中提取几行总结。也就是说,我想要一个函数,它可以接受一个网址,然后返回该页面中最有用的一段文字。(通常这段文字是实际内容的第一段,而不是像导航栏这样的“垃圾文本”。)
我已经成功地把一个HTML页面简化成了一堆文本,通过去掉标签,删除了<HEAD>
部分和所有的脚本。但是,有些文本仍然是“垃圾文本”。我想知道实际的段落文本是从哪里开始的。(理想情况下,这个方法应该不受语言限制,但如果你只有英语的解决方案,那也可能有帮助。)
我该如何判断哪些文本是“垃圾文本”,哪些是实际内容呢?
更新:我看到有些人建议我使用HTML解析库。我正在使用Beautiful Soup。我的问题不是解析HTML;我已经去掉了所有的HTML标签,现在只剩下一堆文本,我想把有用的内容和垃圾文本分开。
4 个回答
可能有点复杂,但你可以试试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?"]
或者你可以使用sentences_from_text这个方法,它属于PunktSentenceTokenizer
这个类。在开始之前,你需要先运行nltk.download()
来下载一些必要的东西。
你可以参考AI depot博客上提到的方法,并结合一些Python代码来实现:
解决这个问题的通用方法其实并不简单。
为了更好地理解这个问题,谷歌在搜索方面的成功很大程度上来自于它们能够自动识别网页中的一些语义信息,也就是找出“内容”在哪里。
一个想到的办法是,如果你能从同一个网站上抓取很多页面,就能发现一些规律。网站的菜单结构在所有页面之间通常是差不多的。如果你能把这些菜单部分去掉(这需要有点模糊处理),剩下的就是内容了。
接下来的步骤是识别文本以及什么算是内容的边界。理想情况下,这些边界应该是一些HTML段落,但大多数时候你不会那么幸运。
一个更好的方法可能是找到这个网站的RSS源,这样你就能直接获取到内容,因为那里的内容已经被简化过了。忽略掉任何广告内容,你应该能得到纯文本。
哦,还有,绝对不要用正则表达式来处理这个问题。处理HTML时,必须使用HTML解析器,毫无疑问。