Подтвердить что ты не робот

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

Update

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

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


Вопрос

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

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

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

ArticleExtractor.INSTANCE.getText(url);

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

ArticleExtractor.INSTANCE.getText(myHtml);

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

Ответ 2

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

Предполагая, что ваш HTML доступен из java.io.Reader, просто позвольте кубическому сегменту сегментировать HTML и классифицировать сегменты для вас:

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

// parse the document into boilerpipe 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 likely to be content or not 
    // block.getText() gives you the block text
}

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

Ответ 3

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

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

  • веб-страница с одной статьей в ней (Boilerpipe достойный!)
  • веб-сайт с несколькими статьями в нем, например, на первой странице времени в Нью-Йорке.
  • веб-страницу, которая на самом деле не содержит в себе никакой статьи, но имеет некоторый контент в отношении ссылок, но может также иметь некоторую степень помех.

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

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

Ответ 7

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

Тег Суп

HTML-блок

Ответ 8

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

Ответ 9

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