【问题标题】:Python: Detecting the actual text paragraphs in a stringPython:检测字符串中的实际文本段落
【发布时间】:2010-07-24 16:15:53
【问题描述】:

主要任务:我正在尝试获取网页的几行摘要。即我想要一个函数,它接受一个 URL 并从该页面返回信息最丰富的段落。 (这通常是实际内容文本的第一段,与导航栏等“垃圾文本”形成对比。)

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

如何判断哪些文本是“垃圾文本”,哪些是实际内容?

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

【问题讨论】:

  • 你能贴出你所拥有的文本样本吗?你希望它变成什么?关于使用正则表达式解析 HTML - 强制链接 - stackoverflow.com/questions/1732348/…
  • 这是来自网页的文本示例:cool-rr.com/sample_text.delete_me.txt 它恰好是 Python 文档中的一个页面。
  • 我删除了[regex] 标签,因为它似乎在诱使人们认为您正在尝试使用正则表达式从页面中提取文本,但这不是您的问题所在全部。这确实是一个文本处理问题。它与 HTML 几乎没有任何关系。文本是从网页中提取的这一事实并不重要,除非您想尝试使用 HTML 标记来帮助您识别重要的文本片段。

标签: python html text screen-scraping


【解决方案1】:

这个问题的一般解决方案是一个不平凡的问题。

为了说明这一点,Google 在搜索方面的成功很大一部分来自于他们能够自动从任意网页中辨别某些语义含义,即找出“内容”在哪里。

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

下一步是识别文本以及边界的构成。理想情况下是一些 HTML 段落,但大多数时候你不会那么幸运。

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

哦,绝对扔掉你的正则表达式代码。毫无疑问,这需要一个 HTML 解析器。

【讨论】:

  • Cletus,HTML 不是问题。这些标签我不感兴趣,我把它们都扔掉了。我正在考虑正则表达式的原因是用它来告诉哪些文本是流动的段落,哪些是导航栏中的链接文本(或其他小段文本)。
【解决方案2】:

您可以使用 AI depot 博客中概述的方法以及一些 Python 代码:

【讨论】:

    【解决方案3】:

    可能有点矫枉过正,但您可以尝试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?"]
    

    或者您可以使用PunktSentenceTokenizer 类中的sentences_from_text 方法。在开始之前,您必须执行nltk.download()

    【讨论】:

      【解决方案4】:

      我建议看看Readability 做了什么。可读性除去页面的实际内容之外的所有内容,并重新设置样式以便于阅读。根据我的经验,它似乎在检测内容方面效果很好。

      看看它的source code(尤其是grabArticle函数),也许你能得到一些想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        • 2016-04-06
        • 2017-10-24
        • 1970-01-01
        • 2016-11-17
        相关资源
        最近更新 更多