Как я могу извлечь только основной текстовый контент с HTML-страницы?

обновление

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

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


Вопрос

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

проблема в том, что веб-страница имеет много контента, такого как меню, реклама, баннеры и т. д.

Я хочу попытаться исключить все, что не связано с содержимым страницы.

взяв эту страницу в качестве примера, я не хочу, чтобы меню выше ни ссылки в нижняя сноска.

важно: все страницы HTML и являются страницами из различных сайтов differents. Мне нужно предложение, как исключить это содержание.

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

решения могут быть основаны на текстовом содержимом (без тегов HTML) или в содержимом HTML (с HTML tags)

Edit: Я хочу сделать это внутри моего Java-кода, а не внешнего приложения (если это возможно).

я попробовал способ разбора содержимого HTML, описанного в этом вопросе: https://stackoverflow.com/questions/7035150/how-to-traverse-the-dom-tree-using-jsoup-doing-some-content-filtering

9 ответов


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

есть несколько способов подачи HTML в Boilerpipe и извлечения HTML.

Вы можете используйте URL:

ArticleExtractor.INSTANCE.getText(url);

Вы можете используйте строку:

ArticleExtractor.INSTANCE.getText(myHtml);

есть также варианты использовать читателя, которым открывает большое количество вариантов.


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

предполагая, что у вас есть HTML, доступный с java.Ио.Читатель, просто позвольте boilerpipe сегментировать HTML и классифицировать сегменты для вас:

Reader reader = ...
InputSource is = new InputSource(reader);

// parse the document into boilerpipe's internal data structure
TextDocument doc = new BoilerpipeSAXInput(is).getTextDocument();

// perform the extraction/classification process on "doc"
ArticleExtractor.INSTANCE.process(doc);

// iterate over all blocks (= segments as "ArticleExtractor" sees them) 
for (TextBlock block : getTextBlocks()) {
    // block.isContent() tells you if it's likely to be content or not 
    // block.getText() gives you the block's text
}

TextBlock имеет некоторые более захватывающие методы, не стесняйтесь играть вокруг!


существует возможная проблема с Boilerpipe. Почему? Ну, похоже, что это подходит для определенных видов веб-страниц, таких как веб-страницы, которые имеют один корпус контента.

таким образом, можно грубо классифицировать веб-страницы на три вида в отношении Boilerpipe:

  1. веб-страница с одной статьей в нем (Boilerpipe достойный!)
  2. Веб с несколькими статьями в нем, например, на первой странице New York times
  3. веб-странице это действительно не имеет никакой статьи в нем, но имеет некоторый контент в отношении ссылок, но также может иметь некоторую степень беспорядка.

Boilerpipe работает на случае №1. Но если человек делает много автоматической обработки текста, то как его программное обеспечение "знает", с какой веб-страницей он имеет дело? Если сама веб-страница может быть классифицирована в одно из этих трех ведер, то Boilerpipe может быть применен для случая № 1. Дело № 2 и дело № 3 проблема - это может потребоваться совокупность связанных веб-страниц для определения того, что является беспорядком, а что нет.


вы можете использовать некоторые библиотеки, как ГУЗ. Он лучше всего работает на статьи / новости. Вы также можете проверить код javascript, который делает аналогичное извлечение, как гусь с читабельность букмарклет


моим первым инстинктом было пойти с вашим первоначальным методом использования Jsoup. По крайней мере, с этим, вы можете использовать селекторы и получать только те элементы, которые вы хотите (т. е. Elements posts = doc.select("p"); и не нужно беспокоиться о других элементах с произвольным содержанием.

что касается вашего другого поста, была ли проблема ложных срабатываний вашим единственным аргументом для отклонения от Jsoup? Если да, не могли бы вы просто настроить количество MIN_WORDS_SEQUENCE или быть более избирательными с вашими селекторами (т. е. не извлекайте элементы div)


http://kapowsoftware.com/products/kapow-katalyst-platform/robo-server.php

проприетарное программное обеспечение, но оно упрощает извлечение с веб-страниц и хорошо интегрируется с java.

вы используете предоставленное приложение для разработки xml-файлов, считываемых api roboserver для анализа веб-страниц. Xml-файлы создаются вами, анализируя страницы, которые вы хотите проанализировать внутри предоставленного приложения (довольно легко) и применяя правила сбора данных (как правило, веб-сайты следуют тем же шаблонам). Вы можете настроить планирование, запуск и интеграцию с БД с помощью предоставленного API Java.

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


вы ищете то, что известно как "скребки HTML" или "скребки экрана". Вот несколько ссылок на некоторые варианты для вас:

Tag Суп

HTML Unit


вы можете отфильтровать HTML-мусор, а затем проанализировать необходимые сведения или использовать API существующего сайта. См. ссылку ниже, чтобы отфильтровать html, я надеюсь, что это поможет. http://thewiredguy.com/wordpress/index.php/2011/07/dont-have-an-apirip-dat-off-the-page/


можно использовать textracto api, он извлекает основной текст "статьи", а также есть возможность извлечь все остальные текстовое содержание. Путем "вычитания" этих текстов вы можете разделить навигационные тексты, тексты предварительного просмотра и т. д. из основного текстового содержания.