Python有什么东西像readability.js?

时间:2010-05-27 12:53:27

标签: javascript python html-content-extraction heuristics

我正在寻找一个类似于Arc90的可读性的软件包/模块/功能等。

http://lab.arc90.com/experiments/readability

http://lab.arc90.com/experiments/readability/js/readability.js

这样我就可以给它一些input.html,结果是该html页面的“主要文本”的清理版本。我希望这样,以便我可以在服务器端使用它(不同于仅在浏览器端运行的JS版本)。

有什么想法吗?

PS:我已经尝试过Rhino + env.js并且该组合有效,但性能是不可接受的,需要几分钟来清理大部分的html内容:((仍然无法找到为什么会有这么大的性能差异)

6 个答案:

答案 0 :(得分:9)

请尝试我的前叉https://github.com/buriy/python-readability,它速度快,并且具有最新javascript版本的所有功能。

答案 1 :(得分:4)

我们刚刚在repustate.com上推出了一个新的自然语言处理API。使用REST API,您可以清除任何HTML或PDF并仅返回文本部分。我们的API是免费的,因此您可以随意使用您的内容。它是在python中实现的。检查出来并将结果与​​readability.js进行比较 - 我认为你会发现它们几乎是100%相同。

答案 2 :(得分:3)

hn.py来自Readability's blog。 App Engine应用程序Readable Feeds使用它。

我已将其作为可安装点的模块捆绑在此处:http://github.com/srid/readability

答案 3 :(得分:1)

我在过去对此做了一些研究,最终在Python中实现了this approach [pdf]。我实现的最终版本在应用算法之前也进行了一些清理,比如删除head / script / iframe元素,隐藏元素等,但这是它的核心。

这是一个具有(非常)天真的“链接列表”鉴别器实现的函数,它试图删除具有重链接到文本比率的元素(即导航栏,菜单,广告等):

def link_list_discriminator(html, min_links=2, ratio=0.5):
    """Remove blocks with a high link to text ratio.

    These are typically navigation elements.

    Based on an algorithm described in:
        http://www.psl.cs.columbia.edu/crunch/WWWJ.pdf

    :param html: ElementTree object.
    :param min_links: Minimum number of links inside an element
                      before considering a block for deletion.
    :param ratio: Ratio of link text to all text before an element is considered
                  for deletion.
    """
    def collapse(strings):
        return u''.join(filter(None, (text.strip() for text in strings)))

    # FIXME: This doesn't account for top-level text...
    for el in html.xpath('//*'):
        anchor_text = el.xpath('.//a//text()')
        anchor_count = len(anchor_text)
        anchor_text = collapse(anchor_text)
        text = collapse(el.xpath('.//text()'))
        anchors = float(len(anchor_text))
        all = float(len(text))
        if anchor_count > min_links and all and anchors / all > ratio:
            el.drop_tree()

在我使用的测试语料库中,它实际上工作得很好,但实现高可靠性需要进行大量调整。

答案 4 :(得分:0)

为什么不尝试使用Google V8 / Node.js而不是Rhino?它应该是可以接受的快速。

答案 5 :(得分:-3)

我认为BeautifulSoup是python的最佳HTML解析器。但是你仍然需要弄清楚网站的“主要”部分是什么。

如果您只解析单个域,那么它非常简单,但找到适用于任何站点的模式并不容易。

也许你可以将readability.js方法移植到python?