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

Обновление

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

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


Вопрос

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

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

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

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

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

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

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

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

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

Ответы [ 9 ]

22 голосов
/ 13 августа 2011

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

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

Вы можете использовать URL :

ArticleExtractor.INSTANCE.getText(url);

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

ArticleExtractor.INSTANCE.getText(myHtml);

Существуют также опции, чтобы использовать Reader , который открывает большое количество опций.

7 голосов
/ 03 ноября 2011

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

Предполагая, что ваш HTML-код доступен из java.io.Reader, просто позвольте шаблону сегментировать 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 имеет несколько более захватывающих методов, не стесняйтесь играть!

5 голосов
/ 07 июня 2014

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

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

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

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

1 голос
/ 20 августа 2011

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

Запатентованное программное обеспечение, но оно позволяет легко извлекать данные с веб-страниц и хорошо интегрируется с Java.

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

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

1 голос
/ 14 августа 2011

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

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

1 голос
/ 12 августа 2011

Вы можете использовать некоторые библиотеки, такие как гусь . Лучше всего работает над статьями / новостями. Вы также можете проверить код javascript, который выполняет аналогичное извлечение, как гусь, с помощью читабельного букмарклета

0 голосов
/ 28 августа 2016

Вы можете использовать textracto api, он извлекает основной текст «статьи», а также есть возможность извлечь весь другой текстовый контент.«Вычитая» эти тексты, вы можете отделить навигационные тексты, предварительные тексты и т. Д. От основного текстового контента.

0 голосов
/ 13 августа 2011

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

0 голосов
/ 11 августа 2011

Вы ищете так называемые «скребки HTML» или «скребки экрана». Вот несколько ссылок на некоторые варианты для вас:

теговый суп

Блок HTML

...