LINUX.ORG.RU

Парсинг HTML


0

1

Требуется использовать какой-нибудь фреймворк или либу для парсинга HTML. Что посоветует великий ЛОР?

Имеется нерегулярный документ HTML, сохраненный, к примеру, с какого-то бложика. Содержащий текст на любом европейском/восточном языке, с/без форматирования, с/без ошибок в тегах, с/без прочим информационным мусором. Браузеры (webkit, в частности) его отображают нормально.

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

Можно что-то, что будет загружать документ в дерево DOM, можно иные инструменты - неважно.

Пишется всё на c++ с qt4. Пробовал с qt-шным webkitом - не получается с ним анализировать все документы. Особенно где текст тупо набран и сверстан без использования div, span и p.

★★★★★

Пробовал с qt-шным webkitом - не получается с ним анализировать все документы.

Это как? Он же дает доступ к дому?

baverman ★★★
()
Ответ на: комментарий от baverman

В нем есть классы QWebFrame, QWebElement и подобные. Есть простейший пример DOM Traversal Example, который парсит и показывает в виде дерева HTML. Но как работать с незакрытым (или закрытым неправильно) тегами текстом (<p> </p>, к примеру) и как подменить модифицированный текст - пока неясно.

Suigintou ★★★★★
() автор топика
Ответ на: комментарий от Suigintou

Но как работать с незакрытым (или закрытым неправильно)

Тебя не должно это волновать, браузер об этом уже позаботился.

baverman ★★★
()
Ответ на: комментарий от Suigintou

> незакрытым тегами текстом

К примеру часть текста идет просто между тегами <body>, где-то в середине появляется фрагмент, обрамленный <p>, потом снова простой текст. В DOM у body будет только один этот фрагмент <p> в child'ах.

Suigintou ★★★★★
() автор топика
Ответ на: комментарий от Suigintou

В DOM у body будет только один этот фрагмент <p> в child'ах.

Обманываешь ведь. Очень сложно поверить, что webkit не дает доступа к текстовым нодам.

baverman ★★★
()
Ответ на: комментарий от Suigintou

Я вот не пойму, в чем проблема?
Ну взял ты кусок текста, обработал и заменил. Какая разница он в теге пэ или нет ?

Jetty ★★★★★
()
Ответ на: комментарий от baverman

> браузер об этом уже позаботился

Текст обрабатывается, без браузера. Модификация абзацев заключается в их передаче в формате plain text движку переводчика, затем вставка перевода на место исходного фрагмента.

Suigintou ★★★★★
() автор топика
Ответ на: комментарий от Jetty

> Какая разница он в теге пэ или нет

А ведь это идея. Надо попробовать с toPlainText и setPlainText родительской ноды...

Suigintou ★★★★★
() автор топика

WebKit. Дает доступ к нодам, ибо я сам парсил с ео помощью.

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от Suigintou

setPlainText удаляет всех child'ов из ноды. А кроме как его в паре с toPlainText для доступа и изменения фрагментов текста (перемежающихся с вложенными тегами/нодами) непонятно что использовать. Т.е. можно выдрать и обработать текст, потеряв ноды; либо взять только ноды, не трогая текст.

Suigintou ★★★★★
() автор топика
Ответ на: комментарий от unC0Rr

> tagsoup

Всё же это (с последующим анализом документа в XML DOM) подошло лучше всего. Спасибо.

Suigintou ★★★★★
() автор топика

Имеется простой язык поиска шаблонов в HTML. Работает как regexp, но оперирует не символами строк, а понятиями в HTML-плоскости - теги, атрибуты. Позволяет найти шаблон и запихать в переменные содержимое нужных атрибутов нужных тегов. Текст представляется тегом TEXT, а данные текста атрибутом DATA тега TEXT (-;

HTML-документ рассматривается как линейная последовательность (без структур типа DOM-деревьев). Соответственно на валидность документа плевать с башни.

https://sites.google.com/site/pavelkolodin/tt

kiverattes ★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.