Есть ли для Python что-то вроде readability.js? - PullRequest
12 голосов
/ 27 мая 2010

Я ищу пакет / модуль / функцию и т. Д., Который примерно соответствует Python-эквиваленту Arc90 readability.js

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 ]

9 голосов
/ 16 июня 2011

Пожалуйста, попробуйте мой форк https://github.com/buriy/python-readability, который работает быстро и обладает всеми функциями последней версии JavaScript.

4 голосов
/ 31 мая 2010

Мы только что запустили новый API обработки естественного языка на repustate.com. Используя REST API, вы можете очистить любой HTML или PDF и вернуть только текстовые части. Наш API бесплатный, поэтому не стесняйтесь использовать его для своего сердца. И это реализовано на python. Проверьте это и сравните результаты с readability.js - думаю, вы обнаружите, что они почти на 100% одинаковы.

3 голосов
/ 07 сентября 2010

hn.py через Блог читабельности . Читаемые каналы , приложение App Engine, использует его.

Я упаковал его как модуль для установки в пипсах здесь: http://github.com/srid/readability

1 голос
/ 29 мая 2010

Я провел некоторое исследование по этому вопросу в прошлом и в итоге реализовал этот подход [pdf] в Python. В последней версии, которую я реализовал, также была проведена некоторая очистка перед применением алгоритма, например, удаление элементов 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()

В тестовом корпусе, который я использовал, он действительно работал довольно хорошо, но для достижения высокой надежности потребуется немало доработок.

0 голосов
/ 28 мая 2010

Я думаю BeautifulSoup - лучший анализатор HTML для python. Но вам все равно нужно выяснить, что такое «основная» часть сайта.

Если вы анализируете только один домен, это довольно просто, но найти шаблон, который работает для любого сайта, не так просто.

Может быть, вы можете перенести подход readability.js на python?

0 голосов
/ 27 мая 2010

Почему бы не попробовать использовать Google V8 / Node.js вместо Rhino? Это должно быть приемлемо быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...