Как я могу извлечь только основной текстовый контент с 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:
- веб-страница с одной статьей в нем (Boilerpipe достойный!)
- Веб с несколькими статьями в нем, например, на первой странице New York times
- веб-странице это действительно не имеет никакой статьи в нем, но имеет некоторый контент в отношении ссылок, но также может иметь некоторую степень беспорядка.
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" или "скребки экрана". Вот несколько ссылок на некоторые варианты для вас:
вы можете отфильтровать HTML-мусор, а затем проанализировать необходимые сведения или использовать API существующего сайта. См. ссылку ниже, чтобы отфильтровать html, я надеюсь, что это поможет. http://thewiredguy.com/wordpress/index.php/2011/07/dont-have-an-apirip-dat-off-the-page/
можно использовать textracto api, он извлекает основной текст "статьи", а также есть возможность извлечь все остальные текстовое содержание. Путем "вычитания" этих текстов вы можете разделить навигационные тексты, тексты предварительного просмотра и т. д. из основного текстового содержания.