Russian Qt Forum

Qt => Общие вопросы => Тема начата: bkmz от Июль 16, 2010, 17:56



Название: Опять... Парсинг HTML
Отправлено: bkmz от Июль 16, 2010, 17:56
Приветствую. Понадобилось тут мне вытащить из html страничек данные.
Код:
<div class="load"><a href="http://d1.vpleer.ru/download2/6/5069/18024145/cdbc4143ba55/%D0%A1%D0%94_%26amp%3B_%D0%90%D1%80%D0%B8%D1%8F-%D0%97%D0%B0%D1%81%D1%8B%D0%BF%D0%B0%D0%B9_%28Joker_Prod%29.mp3" title="Скачать"><img src="/images/load.gif" width="8" height="8" alt="Скачать"/></a></div>
Вот такого вида кусок кода на выходе я должен получить ссылку на mp3.
Пробовал делать как в примере к capturedTexts() - ничего не вышло. Паттерн следущий:
Код:
(<div class=\"load\"><a href=\")(title=\")
QStringList на выходе  3 пустых элемента.


Название: Re: Опять... Парсинг HTML
Отправлено: serg_hd от Июль 16, 2010, 18:31
хз о каком примере ты. Обычные регвыры.
Код
C++ (Qt)
QString strSearch,
        strUrl;
strSearch = "<div class=\"load\"><a href=\"http://d1.vpleer.ru/download2/6/5069/18024145/cdbc4143ba55/%D0%A1%D0%94_%26amp%3B_%D0%90%D1%80%D0%B8%D1%8F-%D0%97%D0%B0%D1%81%D1%8B%D0%BF%D0%B0%D0%B9_%28Joker_Prod%29.mp3\" title=\"Скачать\"><img src=\"/images/load.gif\" width=\"8\" height=\"8\" alt=\"Скачать\"/></a></div>";
QRegExp rxp("<a href=\"(.+mp3)");
rxp.indexIn(strSearch);
if (rxp.capturedTexts().size() == 2) strUrl = rxp.cap(1);
else
{
 // сделать чего-то, если html другой
};
qDebug() << strUrl;
 
output: "http://d1.vpleer.ru/download2/6/5069/18024145/cdbc4143ba55/%D0%A1%D0%94_%26amp%3B_%D0%90%D1%80%D0%B8%D1%8F-%D0%97%D0%B0%D1%81%D1%8B%D0%BF%D0%B0%D0%B9_%28Joker_Prod%29.mp3"
 


Название: Re: Опять... Парсинг HTML
Отправлено: bkmz от Июль 16, 2010, 19:48
Спасибо. Ваш пример работает только для одного блока <div>
У меня есть страница в котрой их больше 30. Мне нужно выцепить только урлы, _http://vpleer.ru/?q=Nightwish Вот отсюда. Сейчас попробую сам подкрутить данную комбинацию.


Название: Re: Опять... Парсинг HTML
Отправлено: serg_hd от Июль 16, 2010, 19:50
Спасибо. Ваш пример работает только для одного блока <div>
Так никто не говорил что их много. А если их и много, то тоже просто. Набирайся опыта.


Название: Re: Опять... Парсинг HTML
Отправлено: bkmz от Июль 16, 2010, 19:54
Спасибо. Ваш пример работает только для одного блока <div>
Так никто не говорил что их много. А если их и много, то тоже просто. Набирайся опыта.
Он мне выводит кучу лишних тегов, куда копать? я просто в регулярках ноль


Название: Re: Опять... Парсинг HTML
Отправлено: serg_hd от Июль 16, 2010, 19:56
копать в сторону извлечения всех "<div class=\"load\">...</div>" из всей страницы. Как вариант - выуживать все ссылки страницы, заканчивающиеся на mp3, но малость рискованно это, мало ли. А регвыры надо знать, без них парсеры не парсеры.


Название: Re: Опять... Парсинг HTML
Отправлено: bkmz от Июль 16, 2010, 19:57
копать в сторону извлечения "<div class=\"load\">...</div>" из всей страницы. Как вариант - выуживать все ссылки страницы, заканчивающиеся на mp3, но малость рискованно это, мало ли. А регвыры надо знать, без них парсеры не парсеры.
Вот именно, как мне вытащить то что находится между ними?


Название: Re: Опять... Парсинг HTML
Отправлено: serg_hd от Июль 16, 2010, 20:00
так выше код же :o
в цикле подставляешь для strSearch каждый такой див и вытягиваешь ссылки


Название: Re: Опять... Парсинг HTML
Отправлено: bkmz от Июль 16, 2010, 20:07
так выше код же :o
в цикле подставляешь для strSearch каждый такой див и вытягиваешь ссылки
У меня все дивы в одном стринге. Там вся страница. Я не могу понять, как их выудить можно?


Название: Re: Опять... Парсинг HTML
Отправлено: bkmz от Июль 16, 2010, 20:16
Код:
QString strUrl;
QRegExp rxp("<a href=\"(.+mp3)");
rxp.indexIn(requestString);
qDebug() << rxp.captureCount();
вот этот код выводит 1!!!! в requestString'e вся стринца, весь html код.


Название: Re: Опять... Парсинг HTML
Отправлено: serg_hd от Июль 16, 2010, 20:22
Код:
QString strUrl;
QRegExp rxp("<a href=\"(.+mp3)");
rxp.indexIn(requestString);
qDebug() << rxp.captureCount();
вот этот код выводит 1!!!! в requestString'e вся стринца, весь html код.

у тебя там див, блин, должен быть, а не вся страница.
Надо:
1. Извлечь все дивы с ссылками
2. Извлечь ссылки из дивов.

Все дивы, пример:
Код
C++ (Qt)
QString strSearch;
QStringList listDivs;
strSearch = "<br><br><div class=\"load\"><a href=\"http://d1.vpleer.ru/download2/6/5069/18024145/cdbc4143ba55/%D0%A1%D0%94_%26amp%3B_%D0%90%D1%80%D0%B8%D1%8F-%D0%97%D0%B0%D1%81%D1%8B%D0%BF%D0%B0%D0%B9_%28Joker_Prod%29.mp3\" title=\"Скачать\"><img src=\"/images/load.gif\" width=\"8\" height=\"8\" alt=\"Скачать\"/></a></div>sdf sdf sdf asf asdf asdf asdf asdf asf <a href=\"1.php\"></a><div class=\"load\"><a href=\"http://d1.vpleer.ru/download2/6/5069/18024145/cdbc4143ba55/%D0%A1%D0%94_%26amp%3B_%D0%90%D1%80%D0%B8%D1%8F-%D0%97%D0%B0%D1%81%D1%8B%D0%BF%D0%B0%D0%B9_%28Joker_Prod%21.mp3\" title=\"Скачать\"><img src=\"/images/load.gif\" width=\"8\" height=\"8\" alt=\"Скачать\"/></a></div>";
QRegExp rxp("(<div class=\"load\"><a href.+</div>)");
rxp.setMinimal(true);
int pos = 0;
 
while ((pos = rxp.indexIn(strSearch, pos)) != -1)
{
 listDivs << rxp.cap(1);
 pos += rxp.matchedLength();
}
 
qDebug() << listDivs;
 

С контейнером дивов понятно же что делать? Всё.


Название: Re: Опять... Парсинг HTML
Отправлено: bkmz от Июль 16, 2010, 20:28
Все. Спасибо. Остальное завтра разгребать буду)