Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Парсер HTML файла

Автор: ++Norton++ 21.11.2009, 1:02

Есть куча файлов html. Из этих файлов ничего не надо, кроме того что стоит в тегах href с одинаково начинающимся адресом. Т.е. html документ имеет примерно такой вид:

<html><head></head><body>
.....
ненужная часть
...
<td>
<a href="?php=text&randomText...">ТекстДляПарсинга</a>
</td>
<td align="left">1234</td>
и т.д. (аналогичные ссылки и пр. теги)

Собственно нужно спарсить текст (хотя бы в QString) находящийся на месте "ТекстДляПарсинга" и то, что за ним, т.е. 1234.
Подскажите, как это лучше всего будет сделать?
Просто никогда раньше парсеры не приходилось писать.
Заранее спасибо!

Автор: Litkevich Yuriy 21.11.2009, 1:06

Цитата(++Norton++ @ 21.11.2009, 4:02) *
и то, что за ним, т.е. 1234.
а за ним длинный HTML-документ ;)

Я думаю надо на помощь звать QtXML.

Автор: ++Norton++ 21.11.2009, 1:13

Именно так, длинный HTML-документ с этими нужными ссылками :)
Насчет QtXML, если можно поподробнее... какой именно класс?
Просто капнул документацию, а их там огромное множество...

Автор: Litkevich Yuriy 21.11.2009, 1:19

Есть Несколько технологий:
SAX и DOM - руководство полностью переведено.
Есть ещё XQuery и XPath, возможно, для этой задачи могут быть удобнее, но только на английском

Автор: kwisp 21.11.2009, 1:39

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

Автор: lioncub 21.11.2009, 10:35

kwisp, точно, все что меджду > < от body и не включая scripts

Автор: ++Norton++ 21.11.2009, 12:57

Спасибо, буду думать во всех направлениях, насчет регехпа думал, но так и не додумался как его применить в данном случае...
Может быть есть какие-нибудь догадки?

Автор: rcdimon 21.11.2009, 13:58

Цитата
Собственно нужно спарсить текст (хотя бы в QString) находящийся на месте "ТекстДляПарсинга" и то, что за ним, т.е. 1234.
Подскажите, как это лучше всего будет сделать?
Просто никогда раньше парсеры не приходилось писать.


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

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

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


Автор: kwisp 21.11.2009, 13:59

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

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

скинешь примеры файлов можно конкретные "примеры" выражения подобрать.

Автор: molchanoviv 21.11.2009, 19:06

Цитата(kwisp @ 21.11.2009, 1:39) *
наверное регехпом можно попробовать.


+1024. Тоже хотел посоветовать QRegExp.

Автор: ++Norton++ 21.11.2009, 22:52

Спасибо за советы! Вот, кстати, пример куска хтмл файла:

 <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++ 29.11.2009, 14:16

Сделал регулярку, как посоветовал rcdimon. Получилось вроде этого:

QRegExp rx("<a.+href.*=.*\"(.+?)\">(.+?)</a.*>");
while ((pos = rx.indexIn(Page, pos)) != -1) {

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

Однако ничего не парсит :( С другой регуляркой работает нормально. Подскажите, дело в регулярке или нужно использовать не "rx.cap" а что-то другое?

Автор: trdm 29.11.2009, 20:10

Блин, я где-то нарывался на html парсер на основе бизона.
Вот бы его в либу оформить, можно было бы просто подключать к проекту.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)