我正在寻找一个类似于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内容:((仍然无法找到为什么会有这么大的性能差异)答案 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?