Есть идеи, как определить основное содержание страницы?

Если бы вам пришлось идентифицировать основной текст страницы (например, на странице блога, чтобы идентифицировать содержимое сообщения), что бы вы сделали? Как вы думаете, что является самым простым способом сделать это?

  1. получить содержимое страницы с cURL
  2. возможно, используйте парсер DOM для идентификации элементов страницы

7 ответов


Это довольно сложная задача, но я бы начал с подсчета пробелов внутри элементов DOM. Признаком читаемого человеком контента являются пробелы и периоды. Большинство статей, похоже, инкапсулируют содержимое в теги абзацев, чтобы вы могли смотреть на все теги p с N пробелами и хотя бы одним знаком препинания.

вы также можете использовать количество сгруппированных тегов абзаца внутри элемента.. Поэтому, если у div есть дети N абзацев, это может быть очень хорошо содержание, которое вы хотите извлекать.


есть некоторые рамки, которые могут архивировать это, один из них http://code.google.com/p/boilerpipe/ который использует некоторую статистику. Некоторые функции, которые могут обнаружить html-блок с основным контентом:

  1. p, div теги
  2. объем текста внутри/снаружи
  3. количество ссылок внутри / снаружи (i.e удалить munus)
  4. некоторые имена классов css и id (часто эти блоки имеют классы или идентификаторы с main, main_block, content e.т. c)
  5. связь между заголовком и текстом внутри контент

вы могли бы рассмотреть:

  • Boilerpipe: "библиотека boilerpipe предоставляет алгоритмы для обнаружения и удаления избыточного "беспорядка" (boilerplate, templates) вокруг основного текстового содержимого веб-страницы. Библиотека уже предоставляет конкретные стратегии для общих задач (например: извлечение новостной статьи), а также может быть легко расширена для отдельных настроек проблемы."
  • Руби Читаемость: "Рубиновая удобочитаемость инструмент для извлечение основного читаемого содержимого веб-страницы. Это Ruby-порт проекта удобочитаемости arc90."
  • на читаемость API-интерфейс: "если вы хотите получить доступ к анализатору читаемости напрямую, API контента доступен по запросу. Свяжитесь с нами если вы заинтересованы."

Кажется, что лучший ответ - "это зависит". Как и в, это зависит от того, как сайт в вопросе отмечен.

  1. если автор использует" общие " теги, вы можете найти контейнер идентификатор элемента как "content" или " main."
  2. если автор использует HTML5, теоретически вы должны иметь возможность запросить <article> элемент, если это страница с одной "историей".

это очень зависит от страницы. Вы знаете что-нибудь о структуре страницы заранее? Если Вам повезет, он может предоставить RSS-канал, который вы можете использовать, или он может быть отмечен некоторыми из новых тегов HTML5, таких как <article>, <section> etc. (который несут больше семантической силы, чем теги pre-HTML5).


недавно я столкнулся с той же проблемой. Я разработал скребок для новостной статьи, и мне пришлось определить основное текстовое содержание страниц статьи. Многие новостные сайты отображают много другого текстового контента рядом с" основной статьей " (e.g "Читать далее", "вам может быть интересно"). Мой первый подход состоял в том, чтобы собрать весь текст между <p> теги. Но это не сработало, потому что были новостные сайты, которые использовали <p> для других элементов, таких как навигация, "подробнее" и т. д. тоже. Некоторое время назад я наткнулся на Boilerpipe libary.

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

это звучало как идеальное решение для моей проблемы, но это было не так. Он потерпел неудачу на многих новостных сайтах, потому что часто не мог разобрать весь текст новостной статьи. Не знаю почему, но думаю, что алгоритм boilerpipe не может иметь дело с плохо написанным html. Поэтому во многих случаях он просто возвращал пустую строку, а не основное содержание новостной статьи.

после этого плохого опыта я попытался разработать свой собственный алгоритм "извлечения текста статьи". Основная идея состояла в том, чтобы разбить html на разные глубины, например:

<html>  
<!-- depth: 1 -->
<nav>
  <!-- depth: 2 -->
   <ul>
      <!-- depth: 3 -->
      <li><a href="/mhh">Site<!-- depth: 5 --></a></li>
      <li><a href="/bla">Site<!--- depth: 5 ---></a></li>
  </ul>
</nav>
<div id='text'>
  <!--- depth: 2 --->
  <p>Thats the main content...<!-- depth: 3 --></p>
  <p>main content, bla, bla bla ... <!-- depth: 3 --></p>
  <p>bla bla bla interesting bla bla! <!-- depth: 3 --></p>
  <p>whatever, bla... <!-- depth: 3 --></p>
</div>

</html>

как вы можете видеть, чтобы отфильтровать излишек " беспорядок "с помощью этого алгоритма, такие вещи, как элементы навигации, разделы" вам может понравиться " и т. д. должен будьте на другой глубине, чем основное содержание. Или другими словами: избыточный "беспорядок" должен быть описан с большим (или меньшим) html-тегами, чем основной текстовый контент.

  1. вычислить глубину каждого элемента html.
  2. найти глубину с наибольшим количеством текстового контента.
  3. выберите весь текстовый контент с этой глубиной

для доказательства этой концепции, я написал Ruby script, который работает хорошо, с большинство новостных сайтов. В дополнение к скрипту Ruby я также разработалtextracto.com api, который вы можете использовать бесплатно.

приветы, Дэвид!--6-->


я портировал исходный java-код boilerpipe в чистую реализацию ruby Ruby Boilerpipe также версия Jruby, обертывающая исходный код Java Jruby Boilerpipe