有没有办法使用可读性和python来提取文本,而不是HTML?

时间:2012-06-22 06:15:33

标签: python readability text-extraction html-content-extraction

我需要在运行时,在服务器端从随机网页中提取纯文本。我使用Google App Engine和Readability python端口。 其中有很多。

  1. 早期version by gfxmonk,基于BeautifulSoup
  2. version by minvolai基于gfxmonk,除了使用lxml而不是BeautifulSoap,使用它(根据minvolai,见项目页面)更快,尽管引入了对lxml的依赖。
  3. version by Yuri Baburov aka buriy。与minvolai相同,取决​​于lxml。还取决于chardet来检测编码。
  4. 我使用Yuri的版本,因为它是最近的版本,似乎正在积极开发中。 我设法使用Python 2.7在Google App Engine上运行它。 现在“问题”是它返回HTML,而我需要纯文本。

    this Stackoverflow article about links extraction中的建议是使用BeatifulSoup。如果没有其他选择,我会的。 BeatifulSoup将是另一种依赖,因为我使用基于lxml的版本。

    我的问题:

    • 有没有办法从我使用的Python可读性版本中获取纯文本而不需要代码?
    • 有没有办法轻松地从Python可读性的HTML结果中检索纯文本,例如使用lxml,或BeatifulSoap,或RegEx,或其他
    • 如果上面的答案是否定的,或者是,但不容易,那么修改Python可读性的方法是什么。这样的修改是否足够令人满意(对于足够的人来说)这样的延期官方?

3 个答案:

答案 0 :(得分:4)

您可以使用html2text。这是一个漂亮的工具。

这是一个关于如何将它与python可读性工具一起使用的链接 - 它们一起被称为read2text。

  

http://brettterpstra.com/scripting-readability-markdownify-for-clipping-web-pages/

希望这会有所帮助:)

答案 1 :(得分:4)

不要让它流连忘返,我目前的解决方案

  1. 我没有找到使用可读性端口的方法。
  2. 我决定使用Beautiful Soup,版本4
  3. BS有一个简单的函数来提取文本
  4. 代码:

    from bs4 import BeautifulSoup 
    soup = BeautifulSoup(html) 
    text =  soup.get_text() 
    

答案 2 :(得分:2)

首先,提取具有可读性的HTML内容

html_snippet = Document(html).summary()

然后,使用库删除HTML标记。有一些警告: 1)您可能需要空格,“<p>some text<br>other text”不应为“some textother text”,您可能需要将列表转换为“-”。 2)“#&39;”应显示为“'”,“&gt;”应显示为“>” - 这称为HTML实体替换(请参阅下文)。

我通常使用名为bleach的库来清除不必要的标签和属性:

cleaned_text = bleach.clean(html_snippet, tags=[])

cleaned_text = bleach.clean(html_snippet, tags=['i', 'b'])

如果要删除所有标记并获得更好的文本格式,则需要使用任何类型的html2text库,或者您可以自己实现自定义格式设置过程。

但我认为你现在有了原创的想法。

对于使用漂白的简单文本格式: 例如,如果您希望段落为“\n”,并将项目列为“\n -”,则:

norm_html = bleach.clean(html_snippet, tags=['p', 'br', 'li'])
replaced_html = norm_html.replace('<p>', '\n').replace('</p>', '\n')
replaced_html = replaced_html.replace('<br>', '\n').replace('<li>', '\n - ')
cleaned_text = bleach.clean(replaced_html, tags=[])

对于仅删除HTML标记且替换实体(“&gt;”应为“>”等)的正则表达式,您可以查看https://stackoverflow.com/a/7778368/217895