Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Парсер HTML файла
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
++Norton++
Есть куча файлов html. Из этих файлов ничего не надо, кроме того что стоит в тегах href с одинаково начинающимся адресом. Т.е. html документ имеет примерно такой вид:
<html><head></head><body>
.....
ненужная часть
...
<td>
<a href="?php=text&randomText...">ТекстДляПарсинга</a>
</td>
<td align="left">1234</td>
и т.д. (аналогичные ссылки и пр. теги)

Собственно нужно спарсить текст (хотя бы в QString) находящийся на месте "ТекстДляПарсинга" и то, что за ним, т.е. 1234.
Подскажите, как это лучше всего будет сделать?
Просто никогда раньше парсеры не приходилось писать.
Заранее спасибо!
Litkevich Yuriy
Цитата(++Norton++ @ 21.11.2009, 4:02) *
и то, что за ним, т.е. 1234.
а за ним длинный HTML-документ ;)

Я думаю надо на помощь звать QtXML.
++Norton++
Именно так, длинный HTML-документ с этими нужными ссылками :)
Насчет QtXML, если можно поподробнее... какой именно класс?
Просто капнул документацию, а их там огромное множество...
Litkevich Yuriy
Есть Несколько технологий:
SAX и DOM - руководство полностью переведено.
Есть ещё XQuery и XPath, возможно, для этой задачи могут быть удобнее, но только на английском
kwisp
по-моему не получится потому что хмл очень тебователен к закрывающим тегам... можно не загрузить документ...
наверное регехпом можно попробовать.
lioncub
kwisp, точно, все что меджду > < от body и не включая scripts
++Norton++
Спасибо, буду думать во всех направлениях, насчет регехпа думал, но так и не додумался как его применить в данном случае...
Может быть есть какие-нибудь догадки?
rcdimon
Цитата
Собственно нужно спарсить текст (хотя бы в QString) находящийся на месте "ТекстДляПарсинга" и то, что за ним, т.е. 1234.
Подскажите, как это лучше всего будет сделать?
Просто никогда раньше парсеры не приходилось писать.


Немного не корректно поставлена задача. Как я понимаю "ТекстДляПарсинга" является текстом ссылки. То есть надо вынимать тексты ыылок. А что значит "и то, что за ним, т.е. 1234" я не понял. Но могу привести регулярку для работы со ссылками например.

Я такие вещи делал на Perl. Регулярка для извлечения URL из ссылки и текста ссылки может быть типа такой

<a.+href.*=.*"(.+?)">(.+?)</a.*>

kwisp
Цитата(++Norton++ @ 21.11.2009, 12:57) *
насчет регехпа думал, но так и не додумался как его применить в данном случае...

как вариант.
читаешь файл в QString.
далее тебе нужен такой regexp чтобы -- искал href=" пропускал все до ">"какой то текст"<"далее текст до открывающего тега(<bla>) какой то текст(<\bla>)
1. сказу надо учесть что в имени ссылки могут быть символы >,<
2. с помощью cap(int) вырезаешь все что нужно.

скинешь примеры файлов можно конкретные "примеры" выражения подобрать.
molchanoviv
Цитата(kwisp @ 21.11.2009, 1:39) *
наверное регехпом можно попробовать.


+1024. Тоже хотел посоветовать QRegExp.
++Norton++
Спасибо за советы! Вот, кстати, пример куска хтмл файла:
 <tbody>
    <tr class="thead" valign="bottom">
      <td rowspan="1" width="80%">Text</td>
      <td align="right" width="20%">Some info:</td>
    </tr>    <tr class="list" bgcolor="#ffffff">
      <td>
        <a href="?cmd=words&amp;page=1&amp;inf=7423&amp;secret=deae3a1c7690f&amp;ps=%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B8">текст1</a>
      </td>
      <td align="right">5701375</td>
    </tr>    <tr class="list" bgcolor="#eeeeee">
      <td>
        <a href="?cmd=words&amp;page=1&amp;inf=12704&amp;secret=d115239573deae3a1c7690f&amp;ps=%D1%82%D0%B5%D0%BA%D1%81%D1%82">текст2</a>
      </td>
      <td align="right">5701027</td>
    </tr>    <tr class="list" bgcolor="#ffffff">
      <td>
        <a href="?cmd=words&amp;page=1&amp;inf=125704&amp;secret=67c115239573deae3a1c7690f&amp;ps=%D1%82%D0%B5%D0%BA%D1%81%D1%82%20%D0%BF%D0%B5%D1%81%D0%BD%D0%B8">текст3</a>
      </td>
      <td align="right">2804612</td>
    </tr>    <tr class="tlist" bgcolor="#eeeeee">
........

Вот. Из такого кода нужно выдрать текст1, текст2, текст3 а также те числа, что идут после ссылки, т.е. в теге td align=right.
Т.е. в данном примере после первой ссылки это 5701375, после второй 5701027, после третьей 2804612.
Заранее еще раз спасибо!
++Norton++
Сделал регулярку, как посоветовал rcdimon. Получилось вроде этого:
QRegExp rx("<a.+href.*=.*\"(.+?)\">(.+?)</a.*>");
while ((pos = rx.indexIn(Page, pos)) != -1) {

     parserList->append( rx.cap(1) );
     pos += rx.matchedLength();
}

Однако ничего не парсит :( С другой регуляркой работает нормально. Подскажите, дело в регулярке или нужно использовать не "rx.cap" а что-то другое?
trdm
Блин, я где-то нарывался на html парсер на основе бизона.
Вот бы его в либу оформить, можно было бы просто подключать к проекту.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.