Найти важный текст в произвольном HTML, используя PHP? - PullRequest
4 голосов
/ 18 марта 2011

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

Я нашел метод, встроенный в Python , и мне было интересно, есть лиэто что-то вроде этого в PHP.

Концепция довольно проста: используйте информацию о плотности текста по сравнению с кодом HTML, чтобы определить, стоит ли выводить строку текста.(Это не новая идея, но она работает!) Основной процесс работает следующим образом:

  1. Анализирует HTML-код и отслеживает количество обработанных байтов.
  2. Сохраняйте вывод текста для каждой строки или для каждого абзаца.
  3. Свяжите с каждой текстовой строкой количество байтов HTML, необходимое для ее описания.
  4. Вычислите плотность текста каждогоВычисление соотношения текста t> o байтов.
  5. Затем решите, является ли строка частью содержимого, используя нейронную сеть.

Вы можете получить довольно хорошие результаты, простопроверяя, находится ли плотность линии выше фиксированного порога (или среднего значения), но система делает меньше ошибок, если вы используете машинное обучение - не говоря уже о том, что это легче реализовать!

Обновление: Я запустил награду за ответ, который может извлечь основной контент из случайного HTML-шаблона.Поскольку я не могу поделиться документами, которые буду использовать - просто выберите любой случайный сайт блога и попробуйте извлечь основной текст из макета.Помните, что верхний, боковой и нижний колонтитулы могут также содержать текст.Смотрите ссылку выше для идей.

Ответы [ 5 ]

5 голосов
/ 25 марта 2011
  • phpQuery является API-интерфейсом объектной модели документов (DOM), управляемым селектором на стороне сервера, на основе jQuery JavaScript Library.

ОБНОВЛЕНИЕ 2

  1. многие блоги используют CMS ;
  2. блогов html структура почти одинакова.
  3. избегайте общих селекторов, таких как #sidebar, #header, #footer, #comments, etc..
  4. избегать любого виджета по имени тега script, iframe
  5. ясно, хорошо знать содержание, как:
    1. /\d+\scomment(?:[s])/im
    2. /(read the rest|read more).*/im
    3. /(?:.*(?:by|post|submitt?)(?:ed)?.*\s(at|am|pm))/im
    4. /[^a-z0-9]+/im

поиск хорошо известных классов и идентификаторов:


$selectors = array('.post-body','.post','.journal-entry-text','.entry-content','.content');
$doc = phpQuery::newDocumentFile('http://blog.com')->find($selectors)->children('p,div');

поиск на основе общей структуры HTML, которая выглядит следующим образом:

<div>
<h1|h2|h3|h4|a />
<p|div />
</div>

$doc = phpQuery::newDocumentFile('http://blog.com')->find('h1,h2,h3,h4')->parent()->children('p,div');
3 голосов
/ 21 марта 2011

Domdocument может использоваться для анализа HTML-документов, которые затем могут быть запрошены через PHP.

Редактировать: wikied

2 голосов
/ 18 марта 2011

Я работал над похожим проектом некоторое время назад. Это не так сложно, как сценарий Python, но он будет хорошо работать. Проверьте простой HTML-анализатор PHP

http://simplehtmldom.sourceforge.net/

1 голос
/ 29 марта 2011

Я разработал анализатор HTML и пакет PHP фильтра, который можно использовать для этой цели.

Он состоит из набора классов, которые могут быть объединены в цепочку для выполнения ряда операций синтаксического анализа, фильтрации и преобразования в коде HTML / XML.

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

Один из классов фильтров, с которыми он поставляется, может выполнять проверку DTD. Другой может отбросить небезопасные теги HTML и CSS, чтобы предотвратить атаки XSS. Другой может просто извлечь все ссылки на документы.

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

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

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

1 голос
/ 23 марта 2011

В зависимости от вашей структуры HTML, и если у вас есть идентификаторы или классы, вы можете немного усложниться и использовать preg_match (), чтобы специально получать любую информацию между определенным начальным и конечным тегом.Это означает, что вы должны знать, как писать регулярные выражения.

Вы также можете заглянуть в класс PHP эмуляции браузера.Я сделал это для очистки страниц, и это работает достаточно хорошо в зависимости от того, насколько хорошо отформатирован DOM.Мне лично нравится SimpleBrowserhttp://www.simpletest.org/api/SimpleTest/WebTester/SimpleBrowser.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...