Соскоб в Интернете - как определить основной контент на веб-странице - PullRequest
42 голосов
/ 12 января 2011

Учитывая веб-страницу новостной статьи (из любого крупного источника новостей, такого как Times или Bloomberg), я хочу определить основной контент статьи на этой странице и выбросить другие элементы разного типа, такие как реклама, меню, боковые панели, комментарии пользователей.

Какой общий способ сделать это будет работать на большинстве крупных новостных сайтов?

Какие хорошие инструменты или библиотеки для интеллектуального анализа данных? (предпочтительно на основе Python)

Ответы [ 9 ]

28 голосов
/ 12 января 2011

Есть несколько способов сделать это, но ни один не всегда будет работать. Вот два самых простых:

  • если это известный конечный набор веб-сайтов: в вашем скребке преобразуйте каждый URL-адрес из обычного URL-адреса в URL-адрес печати для данного сайта (не может быть обобщен для всех сайтов)
  • Использовать алгоритм читаемости arc90 (эталонная реализация в javascript) http://code.google.com/p/arc90labs-readability/. Краткая версия этого алгоритма - это поиск элементов с тегами p внутри них. Это не будет работать для некоторых веб-сайтов, но, как правило, довольно хорошо.
8 голосов
/ 30 августа 2012

Diffbot предлагает бесплатный (10.000 URL) API для этого, не знаю, подходит ли вам этот подход, но он может кому-то помочь http://www.diffbot.com/

8 голосов
/ 13 января 2011

Некоторое время назад я написал простой скрипт на Python только для этой задачи.Он использует эвристику для группировки текстовых блоков на основе их глубины в DOM.Группа с наибольшим количеством текста считается основным контентом.Это не идеально, но в целом хорошо работает для новостных сайтов, где статья, как правило, самая большая группа текста, даже если она разбита на несколько тегов div / p.*

7 голосов
/ 20 января 2015

Для решения в Java взгляните на https://code.google.com/p/boilerpipe/:

Библиотека шаблонов предоставляет алгоритмы для обнаружения и удаления излишнего "беспорядка" (шаблонов, шаблонов) вокруг основного текстового содержимого веб-страницы.

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

Но здесь также есть оболочка для Python:

https://github.com/misja/python-boilerpipe

6 голосов
/ 12 января 2011

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

4 голосов
/ 12 января 2011

Может быть более полезным извлечь RSS-каналы (<link type="application/rss+xml" href="..."/>) на этой странице и проанализировать данные в ленте, чтобы получить основное содержимое.

3 голосов
/ 01 апреля 2018

Проверьте следующий скрипт.Это действительно удивительно:

from newspaper import Article
URL = "https://www.ksat.com/money/philippines-stops-sending-workers-to-qatar"
article = Article(URL)
article.download()
print(article.html)
article.parse()
print(article.authors)
print(article.publish_date)
#print(article.text)
print(article.top_image)
print(article.movies)
article.nlp()
print(article.keywords)
print(article.summary)

Дополнительную документацию можно найти на http://newspaper.readthedocs.io/en/latest/ и https://github.com/codelucas/newspaper, вы должны установить ее, используя:

pip3 install newspaper3k
3 голосов
/ 13 января 2011

Другая возможность отделения «реального» контента от шума - это измерение плотности HTML частей HTML-страницы.

Вам потребуется немного поэкспериментировать с пороговыми значениями для извлечения«реальный» контент, и я думаю, что вы могли бы улучшить алгоритм, применяя эвристику для указания точных границ сегмента HTML после определения интересного контента.

Обновление: только что обнаруженный URL-адрес выше не работаетпрямо сейчас; здесь есть альтернативная ссылка на кэшированную версию archive.org.

0 голосов
/ 12 января 2011

Я бы не пытался соскрести его с веб-страницы - слишком много вещей могло бы испортить его - но вместо этого посмотрим, какие веб-сайты публикуют RSS-каналы.Например, RSS-лента Guardian содержит большую часть текста из их ведущих статей:

http://feeds.guardian.co.uk/theguardian/rss

Я не знаю, есть ли у The Times (The London Times, не NY)потому что это за платным доступом.Удачи с этим ...

...