Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
30 / 30 / 21
Регистрация: 22.09.2013
Сообщений: 359
1

Регулярные выражения для парсера html

22.12.2015, 19:34. Просмотров 701. Ответов 7
Метки нет (Все метки)

Здравствуйте, не давно начал изучать c++ и решил сделать не большой парсер html(в данном случае конкретного сайта), в качестве библиотеке регулярных выражений использую regex.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <regex>
....
using namespace std;
....
TStringList *ResultHttp= new TStringList;
string str;
ResultHttp->Text = DataModule1->IdHTTP1->Get("сайт");
 tr1::regex rx("<div class=\"numbers   \"><div class=\"container\">(.*?)</div></div>");
 str = tr1::regex_search(ResultHttp->Text.c_str(), ResultHttp->Text.c_str(), rx);
 ShowMessage(str.c_str());
....
Отрывок HTML который

HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<div class="elem">
                    <div class="main">
                        <div class="draw">
                            <a href="/archive/4015">4015</a>
                            <span class="alt_links"> / <ins class="pseudo">22.12.2015 17:56</ins></span>
                        </div>
                        <div class="numbers   ">
                            <div class="container">
                                                                                                            <b>8</b>
                                        
                                                                            <b>31</b>
                                        
                                                                            <b>14</b>
                                        
                                                                            <b>28</b>
                                        
                                                                            <b>32</b>
                                        
                                                                                                                                    </div>
                        </div>
                                                <div class="call">
                                                            1&nbsp;463&nbsp;730                                                 </div>
                    </div>
                </div>
Хочу получить

<b>8</b>

<b>31</b>

<b>14</b>

<b>28</b>

<b>32</b>

Пример конечно же грубый, но в итоге получаю пустое сообщение (((
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2015, 19:34
Ответы с готовыми решениями:

Регулярные выражения
Надо использовать регулярное выражение, но что-то не получается. Подскажите плиз. Примеры что...

Регулярные выражения
Доброго времени суток друзья. С регулярными выражениями никогда не работал поэтому обращаюсь к Вам....

Регулярные выражения C++ Builder XE3
Помогите, пожалуйста. Перечитал уже кучу форумов и советов. Необходимо в StringList проверить i-тую...

Регулярные выражения в 64 битном приложении
Всем привет. Вот задумался перевести свой проект на 64 бита. Так вот, в проекте используется...

7
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30647 / 20000 / 7822
Регистрация: 22.10.2011
Сообщений: 34,827
Записей в блоге: 6
22.12.2015, 19:56 2
Пробельные символы не учитываешь:
C++
1
tr1::regex rx("<div class=\"numbers   \">\\s+<div class=\"container\">\\s+(.*?)</div>\\s+</div>");
(проверить негде, кроме как в Notepad++, там отрабатывает подобная регулярка)
0
30 / 30 / 21
Регистрация: 22.09.2013
Сообщений: 359
22.12.2015, 20:09  [ТС] 3
Спасибо за ответ, но не помогло. Думаю дело в этой строчке

C++
1
str = tr1::regex_search(ResultHttp->Text.c_str(), ResultHttp->Text.c_str(), rx);
В примере который я нашел
C++
1
str = tr1::regex_search(ResultHttp->Text.begin(), ResultHttp->Text.end(), rx);
Но в этом случае компилятор ругается [bcc32 Error] general.cpp(35): E2316 'Begin' is not a member of 'UnicodeString'
Full parser context
general.cpp(24): parsing: .....
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30647 / 20000 / 7822
Регистрация: 22.10.2011
Сообщений: 34,827
Записей в блоге: 6
22.12.2015, 20:43 4
Так сконвертируй UnicodeString в std::string, и используй begin()/end()
1
30 / 30 / 21
Регистрация: 22.09.2013
Сообщений: 359
22.12.2015, 21:46  [ТС] 5
А вы не подскажите как это конвертирование сделать?

C++
1
str = ResultHttp->Text.t_str();
C++
1
str = Utf8ToAnsi(ResultHttp->Text);
Не прокатывает
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30647 / 20000 / 7822
Регистрация: 22.10.2011
Сообщений: 34,827
Записей в блоге: 6
23.12.2015, 00:38 6
У меня в XE2 это прекрасно делается через:
C++
1
2
    String us = "test";
    std::string s = AnsiString(us).c_str();
или
C++
1
2
    String us = L"тест";
    std::wstring ws = us.c_str();
0
978 / 614 / 360
Регистрация: 07.11.2015
Сообщений: 976
23.12.2015, 13:37 7
Так вроде ж по умолчанию метасимвол точка совпадает с любым символом кроме перевода строки. Точку можно заменить этой конструкцией [\S\s]
0
30 / 30 / 21
Регистрация: 22.09.2013
Сообщений: 359
24.12.2015, 21:05  [ТС] 8
C++
1
2
3
4
5
6
TStringList *ResultHttp= new TStringList;
string str;
string SearchString = AnsiString(ResultHttp->Text).c_str();
tr1::regex rx("<div class="numbers   ">\\s+<div class="container">\\s+(.*?)</div>\\s+</div>");
 str = tr1::regex_search(SearchString.begin(), SearchString.end(), rx);
 ShowMessage(str.c_str());
Получаю пустую строчку (

Добавлено через 23 часа 23 минуты
Может быть все же дело в самой регулярке? Или я как то не так вывожу? (
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2015, 21:05

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Чтение файла в потоке и регулярные выражения
Доброго времени! Дали задание написать небольшой парсер из файла. Файл не текстовый, а результат...

Регулярные выражения аналог preg_match в C++ Builder
Появилась необходимость в регулярных выражениях. И решил на будущее сделать аналог из PHP -...

Регулярные выражения для парсинга HTML
Допустим скачал HTML страницу. Внутри ее кучи строк и мне нужно вырезать все , что находится между...

Регулярные выражения для парсинга HTML
Как можно заменить такое: .Replace(&quot;&lt;font color=\&quot;White\&quot;&gt;&quot;, &quot;&quot;) .Replace(&quot;&lt;font...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.