Есть ли что-нибудь для Python, который похож на readability.js?

Я ищу пакет / модуль / функция и т.д., которая является приблизительно Python, эквивалентным из readability.js Arc90

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

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

так, чтобы я мог дать его, некоторый input.html и результат очищены версия "основного текста" той страницы HTML. Я хочу это так, чтобы я мог использовать его на серверной стороне (в отличие от версии JS, которая работает только на стороне браузера).

Какие-либо идеи?

PS: Я попробовал Носорога + env.js и та комбинация работы, но производительность недопустима, требуются минуты для чистки большей части содержимого HTML :( (все еще не мог найти, почему существует такое большое различие в производительности).

12
задан Shay Erlichmen 27 May 2010 в 13:02
поделиться

4 ответа

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

0
ответ дан 2 December 2019 в 21:02
поделиться

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

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

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

-3
ответ дан 2 December 2019 в 21:02
поделиться

Я сделал некоторые исследования по этому поводу в прошлом и в конечном итоге реализация этого подхода [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()

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

1
ответ дан 2 December 2019 в 21:02
поделиться

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

4
ответ дан 2 December 2019 в 21:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: