13.09.2010, 22:40 | #1 |
Эксперт
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 249
|
Универсальный парсер HTML кода
У меня часто возникает потребность парсинга html-страниц с дальнейшим анализом. Потребностей у меня две:
1) Преобразование html в dom-модель, и делай с ней, что хошь. 2) Преобразование html в простой текст, т.е. вычленение только текста. Сейчас решаю эти задачи на питоне с помощью библиотеки BeautifulSoup и разумеется регулярных выражений. BeautifulSoup хороша - преобразует страницу в объектную модель, имеет огромный и гибкий функционал, но работает медленно. Но главное, это то, что на шибко кривом HTML-коде возникают ошибки парсинга. Предварительной обработкой регулярными выражениями я могу исправить ошибки только конкретных источников. А мне хотелось бы иметь максимально устойчивую к ошибкам систему парсинга. Чтобы хотя бы только текст вычленяла из HTML-кода надежно. Для валидного HTML-кода написать такой скрипт не сложно, но все мои системы парсинга разбиваются о суровую реальность. Вот несколько кривых кусков HTML кода с одного государственного портала: Код:
<A\n <BR / href="http://www.site.ru" >Некий текст</A> <P Иванов id=Значение_без_кавычек_кирилицей><P>Некий текст</P> <SPAN><SPAN Л.И. Некий текст</SPAN> Как страницы с такими кусками html-кода обрабатывать? Мне хотя бы простой текст с таких страниц вычленять. |
13.09.2010, 23:11 | #2 |
Эксперт
|
искать по запросу "парсинг html" пробывал ?- там вроде куча полезной инфы...
__________________
|
13.09.2010, 23:26 | #3 |
шатапфакап
Регистрация: 01.09.2008
Адрес: там где клен шумит (с)
Сообщений: 1,472
Вес репутации: 265
|
boric, dom модель исходника должна быть четкой, иначе тут любой парсер спотыкнется, если взять допустим тот же xml то там парсеры(классы php) вообще отказываются работать если нет закрывающих или открывающих тегов в нужной последовательности. Кстати на php.net есть уйма regexp по корректировке кривых html кодов, видимо придется их объединить в один скрипт, который будет все корректировать.
по поводу вычленения текста, simple_html_dom это лучшее что я видел, работает быстро, но на кривом коде 100% споткнется есть еще вариант 2 и 3, оба они из разряда, "какбе лень заморачиваться" 2) на этапе анализа кода при обнаружении кривых тегов, не закрытых итд итп прекращать работу и переходить к другой странице 3) модификация п.2, только для варианта с вытаскиванием текста со страницы, парсить все, что можно собрать со страницы, т.е. что не проходит по тегам пропускать, на выходе соотвественно будет какой-то спарсенный текст, но не целиком
__________________
|
13.09.2010, 23:45 | #4 |
Мастер
|
boric, в общем случае никак =)
Все валидные семьи похожи друг на друга, каждая невалидная семья невалидна по-своему. (Лев Толстой) Понять, в чём причина невалидности в общем случае нельзя. Ладно там кто-то тег <br /> внутрь тега <a запихнул>, а если кто-то на бекспейсе подремал?
__________________
|
14.09.2010, 00:53 | #5 | |||
Эксперт
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 249
|
Anadonam,
Цитата:
justworker, Цитата:
Valentyn, Цитата:
Но я не оставляю надежды найти простое решение для вычленения текста. Полнота 100% не требуется. Если уж все кривое, то некие потери текста приемлемы. Сложные решения рассматривать не хочу, т.к. для задачи вычленения только текста считаю их избыточными, да и работают они медленно - 20000 документов у меня почти сутки обрабатывались. Хочу ограничиться небольшим набором регулярных выражений. Надо или убрать теги, оставив текст, или вычленить из тегов текст. Но расчитывать на закрывающие теги я не могу, да и на то, что тег будет закрыт треугольной скобкой - тоже. На месте атрибутов тегов может быть все что угодно, и это "все что угодно" надо удалять. В общем попробую простой вариант придумать. Главное, чтобы большие куски текста не выпадали. |
|||
14.09.2010, 01:16 | #7 | |
Эксперт
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 249
|
Valentyn,
Цитата:
А для задач, где требуется ДОМ-модель (я сейчас прикинул) мне источник заранее известен будет, поэтому смогу индивидуально парсер настроить или код почистить. Не удобно, конечно, но выполнимо. А вот для поиска хотелось бы иметь универсальное, простое и быстрое решение. |
|
14.09.2010, 01:18 | #8 |
Мастер
|
в принципе, незакрытый тэг можно ограничить, встретив следующий открытый.
из ограниченого можно взять все слова, не совпадающие с тегами и стандартными атрибутами.
__________________
|
14.09.2010, 01:51 | #10 | |
Эксперт
Регистрация: 05.03.2008
Сообщений: 1,095
Вес репутации: 249
|
Valentyn,
Цитата:
|
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Уникализатор html кода | Русская мафия | Разработка и сопровождение сайтов | 23 | 20.03.2010 15:40 |
Установка кода Sape на голый HTML. Вылазит часть кода | barushk | Вопросы от новичков | 5 | 07.04.2009 08:14 |
Установка кода на HTML | Nikko | Установка кода на различные движки | 2 | 06.04.2008 09:54 |
Оптимизация HTML кода | ddvhouse | Пожелания пользователей системы | 8 | 16.06.2007 08:54 |
Часовой пояс GMT +3, время: 00:23.