Поиск:

Ответ в темуСоздание новой темы Создание опроса
> парсинг html с помощью регулярных выражений 
:(
    Опции темы
586
Дата 13.7.2008, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: нет
Всего: 146



Примерное содержимое html документа:
Код
<a href="11.txt">1111</a>
<a href="22.txt">2222</a>
list
<a href="33.txt">3333</a>
<a href="44.txt">4444</a>
end
<a href="55.txt">5555</a>
<a href="66.txt">6666</a>

Регулярное выражение, которое получает все ссылки из документа:
Код
<a .*?href="(.*?)".*?>(.*?)</a>

Никак не получается модифицировать регулярное выражение, чтобы получить ссылки между словами list и end. Это возможно сделать с помощью одного регулярного выражения, или придётся обрабатывать текст два раза?
PM   Вверх
W4FhLF
Дата 13.7.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



AFAIK, два раза. Хотя я никогда не юзал мощные движки, вроде тех, что в perl, там скорее всего есть возможность построить такое выражение. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
586
Дата 13.7.2008, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: нет
Всего: 146



А boost::regex и VBScript.RegExp способны обработать подобное выражение?
PM   Вверх
W4FhLF
Дата 13.7.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



Ну VBScript.RegExp достаточно слабенький, а boost::regex я юзал в рамках базового функционала. Вообще, я даже не представляю как можно было бы составить выражение... Зайди в раздел по PERL и задай там этот вопрос, будет интересно посмотреть как его решат, если что ссылку в личку кинь smile


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
corpsehunter
Дата 15.7.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 24.2.2007

Репутация: нет
Всего: 3



нипонятно, в чем проблема? или я что-то не так понял или все просто - выражение для одной ссылки берешь в скобки и ставишь сзади *, если ссылок может любое количество и добавляешь в регулярное выражение спереди и сзади list и end, соответственно.
--------------------
Тест на IQ показал отрицательный результат...
PM MAIL   Вверх
W4FhLF
Дата 15.7.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



corpsehunter, я так понял надо получить не весь блок ссылок со словами list и end, а просто ссылки по отдельности, которые находятся в пределах этих слов. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
corpsehunter
Дата 15.7.2008, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 24.2.2007

Репутация: нет
Всего: 3



ну дак все равно не вижу проблемы - когда пишешь регулярное выражение с круглыми скобками можно обращаться к отдельно к каждому элементу заключенному в скобки.
--------------------
Тест на IQ показал отрицательный результат...
PM MAIL   Вверх
W4FhLF
Дата 16.7.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



corpsehunter, ты про какой движок регулярок? В VBScript.RegExp, насколько мне известное, такое невозможно. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
corpsehunter
Дата 18.7.2008, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 199
Регистрация: 24.2.2007

Репутация: нет
Всего: 3



в VBScript.RegExp может и нет. давненько уже было - я вообще на яве писал, там было=) Кстати, писал прогу тоже хтмл парсить=)))
--------------------
Тест на IQ показал отрицательный результат...
PM MAIL   Вверх
586
Дата 18.7.2008, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: нет
Всего: 146



А boost::regex слабый?

Попробовал составить выражение
Код
list(?:.*?<a .*?href="(.*?)".*?>(.*?)</a>.*?)*?end

boost::regex выдал следующее:
Код
[0] = 44.txt
[1] = 4444

а нужно
Код
[0] = 33.txt
[1] = 3333
[2] = 44.txt
[3] = 4444

В чём проблема?
Выложу ещё код (может нужно там флаг какой-нибудь установить?)
Код
#include <windows.h>
#include <locale>
#include <iostream>
#include <string>
#include <vector>
#include <boost/regex.hpp>

const char txt[] = "<a href=\"11.txt\">1111</a>\r\n"
                   "<a href=\"22.txt\">2222</a>\r\n"
                   "list\r\n"
                   "<a href=\"33.txt\">3333</a>\r\n"
                   "<a href=\"44.txt\">4444</a>\r\n"
                   "end\r\n"
                   "<a href=\"55.txt\">5555</a>\r\n"
                   "<a href=\"66.txt\">6666</a>";

void main(int, char**)
{
    setlocale(LC_ALL, "");

    try {
        std::vector<std::string> result;

        if(boost::regex_split(std::back_inserter(result), std::string(txt), 
            boost::regex("list(?:.*?<a .*?href=\"(.*?)\".*?>(.*?)</a>.*?)*?end", boost::regex_constants::icase)))
        {
            std::cout << "Found " << result.size() << " elements" << std::endl;
            for(UINT i = 0; i < result.size(); ++i)
            {
                std::cout << "[" << i << "] = " << result[i] << std::endl;
            }
        } else {
            std::cout << "Not found" << std::endl;
        }
    }
    catch(std::exception &ex) {
        std::cout << "EXCEPTION: " << ex.what() << std::endl;
    }

    std::cin.get();
}

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0772 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.