Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 24.03.2022
Сообщений: 7

Парсинг HTML страницы через Match()

24.03.2022, 20:47. Показов 1714. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возникла проблема при парсинге хтмл страницы с помощью Match()
В коде имеется строка (см. 1 скрин), пытаюсь выйти на ее значения с помощью шаблонов (см. 2 скрин).
Первый шаблон работает, находит строку, второй по неведомым причинам - нет.
Грешу на кодировки, но не знаю куда копать, как проверять и менять.
Миниатюры
Парсинг HTML страницы через Match()   Парсинг HTML страницы через Match()  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.03.2022, 20:47
Ответы с готовыми решениями:

Парсинг html страницы. Как найти фразу?
Здравствуйте. Подскажите пожалуйста есть код: WebClient^ WebBrowserClient = gcnew WebClient; String^ url =...

Парсинг html страницы
Необходимо загрузить страницу в Grid: ...

Парсинг страницы html
Здравствуйте. Помогите отпарсить нужные данные со страницы загруженную в элемент webBrowser. Может быть и есть где-то, но я не пойму так...

11
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
24.03.2022, 22:32
Лучший ответ Сообщение было отмечено superhacker1999 как решение

Решение

superhacker1999, попробуйте передать дополнительный аргумент в конструктор RegexOptions::Singleline.

P.S. На будущее - код лучше выкладывать текстом.
0
0 / 0 / 0
Регистрация: 24.03.2022
Сообщений: 7
25.03.2022, 15:15  [ТС]
Вау! Сразу заработало, спасибо огромное.
Но есть одно "но".
На сайте отображаются предложения о покупке предмета в разной валюте (каждый продавец выставляет свою валюту). Я же ищу самый дешевый предмет в любой валюте, но если самый дешевый предмет продается за рубли то в форме я получаю это:
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
25.03.2022, 15:34
Цитата Сообщение от superhacker1999 Посмотреть сообщение
но если самый дешевый предмет продается за рубли то в форме я получаю это:
Покажите код скачивания страницы.
0
0 / 0 / 0
Регистрация: 24.03.2022
Сообщений: 7
25.03.2022, 15:37  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
        String^ weapon = {};
        String^ skin = {};
        String^ exterior = {};
 
        if (comboBox1->Text->Contains("Knife") || comboBox1->Text->Contains("Daggers") || comboBox1->Text->Contains("Bayonet") || comboBox1->Text->Contains("Karambit")) { // 
            weapon = weapon + "/%E2%98%85%20"; // https://steamcommunity.com/market/listings/730/%E2%98%85%20Bowie%20Knife%20%7C%20Forest%20DDPAT%20%28Field-Tested%29
        }
 
        if (checkBox1->Checked) { // if stattrak enabled
            weapon = weapon + "%20StatTrak™%20";
        }
 
        if (comboBox1->Text->Contains(" ")) {
            weapon = weapon + comboBox1->Text->Replace(" ", "%20") + "%20%7C%20";
        }
        else {
            weapon = weapon + comboBox1->Text + "%20%7C%20";
        }
 
 
        if (comboBox2->Text->Contains(" ")) {
            skin = skin + comboBox2->Text->Replace(" ", "%20") + "%29";
        }
        else {
            skin = skin + comboBox2->Text + "%29";
        }
 
        if (comboBox3->Text->Contains(" ")) {
            exterior = exterior + comboBox3->Text->Replace(" ", "%20") + "%20%28";
        }
        else {
            exterior = exterior + comboBox3->Text + "%20%28";
        }
 
        linkLabel1->Text = "https://steamcommunity.com/market/listings/730/" + weapon + exterior + skin;
        WebClient^ wb = gcnew WebClient();
        String^ line = wb->DownloadString(linkLabel1->Text);
 
        
        Regex^ price_value = gcnew Regex("<span class=\"market_listing_price market_listing_price_with_fee\">(.*?)</span>", RegexOptions::Singleline); 
        Match^ match_price = price_value->Match(line);
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
25.03.2022, 15:45
superhacker1999, WebClient плохо работает с кодировками. Попробуйте явно её указать
C++
36
37
38
        WebClient^ wb = gcnew WebClient();
        wb->Encoding = System::Text::Encoding::UTF8;
        String^ line = wb->DownloadString(linkLabel1->Text);
1
0 / 0 / 0
Регистрация: 24.03.2022
Сообщений: 7
25.03.2022, 15:49  [ТС]
Заработало, спасибо, Человечище!!!
0
0 / 0 / 0
Регистрация: 24.03.2022
Сообщений: 7
26.03.2022, 13:08  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
WebClient плохо работает с кодировками. Попробуйте явно её указать
Можно еще вопрос? Пытаюсь отловить нужные мне валюты, доллары прокатывают, евро тоже. на "руб." никаких ошибок не выходит, но по итогу на странице "руб" он игнорирует и переходит на ближайший доллар либо евро.
При добавлении в код поиска фунта "£" либо йены "¥" выходит варнинг C4566: символ, представленный универсальным именем символа "\u00A5", невозможно представить в текущей кодовой странице (1251)
Хотя хедер (Form.h) в котором прописаны все эти операции я сохраняю с кодировкой "Юникод (UTF-8"). Код поиска символов прилагаю.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        Regex^ match_no_items = gcnew Regex("market_listing_table_message"); // checking if there are listed items
        if (match_no_items->Match(line)->Success) {
            label6->Text = "There are no listed items";
        }
        int i = 0; // target 
        while (1) {
            if (price_value->Match(line, i)->Groups[1]->Value->Contains("руб")) {
                label7->Text = price_value->Match(line, i)->Groups[1]->Value;
                break;
            }
            else if (price_value->Match(line, i)->Groups[1]->Value->Contains("€")) {
                label7->Text = price_value->Match(line, i)->Groups[1]->Value;
                break;
            }
            else if (price_value->Match(line, i)->Groups[1]->Value->Contains("USD")) {
                label7->Text = price_value->Match(line, i)->Groups[1]->Value;
                break;
            }
            else if (price_value->Match(line, i)->Groups[1]->Value->Contains("¥")) {
                label7->Text = price_value->Match(line, i)->Groups[1]->Value;
                break; 
            }
            else {
                i = price_value->Match(line, i)->Index + 1;
            }
        }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
26.03.2022, 19:54
superhacker1999, нужно смотреть текст страницы и пройтись отладчиком чтобы понять в чем дело. Я только могу отметить что цикл с постоянными вызовами price_value->Match(line, i) выглядит мягко говоря странно. Если нужно обработать несколько результатов, то используйте метод Matches и проходите по коллекции.

Добавлено через 55 секунд
И насчет кодировки исходного файла - видимо он все таки не в UTF-8 сохранен. Не знаю почему, но ошибка говорит сама за себя.
0
0 / 0 / 0
Регистрация: 24.03.2022
Сообщений: 7
26.03.2022, 20:46  [ТС]
OwenGlendower, про цикл: использую его таким образом, поскольку мне нужно будет знать какую именно валюту я нашел и перевести ее позже в рубли (,но больше по незнанию). Может быть нужно не только хедер сохранять в UTF-8 но и каждый файл проекта? По крайней мере хедер и .cpp файл с вызовом формы я сохраняю в UTF-8....
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
26.03.2022, 22:11
superhacker1999, поиск валюты вопросов не вызывает. Непонятно зачем постоянно делать один и тот же поиск. Что мешает сделать его ровно один раз? Хотя бы так:
C++
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        int i = 0; // target 
        while (1) {
            String^ value = price_value->Match(line, i)->Groups[1]->Value;
            if (value->Contains("руб")) {
                label7->Text = value;
                break;
            }
            else if (value->Contains("€")) {
                label7->Text = value;
                break;
            }
            else if (value->Contains("USD")) {
                label7->Text = value;
                break;
            }
            else if (value->Contains("¥")) {
                label7->Text = value;
                break; 
            }
            else {
                i = price_value->Match(line, i)->Index + 1;
            }
        }
Насколько проще сразу код стал. Согласны?

Можно еще упростить код. Например не вручную индексы задавать, а использовать метод NextMatch().

Еще более л3уучшим вариантом будет отказ от регулярных выражений и переход на специализированные библиотеки вроде AngleSharp. В C++/CLI только неудобно её ставить. Там не поддержки NuGet насколько я знаю. Придется вручную подключать.
0
0 / 0 / 0
Регистрация: 24.03.2022
Сообщений: 7
26.03.2022, 23:39  [ТС]
Согласен, спасибо
Я пока просто на этапе "лишь бы заработало"
основная и наверное единственная проблема пока что - это кодировки, их победить пока не удается))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.03.2022, 23:39
Помогаю со студенческими работами здесь

Парсинг HTML страницы
вот есть текст &lt;div class=&quot;w300 left&quot;&gt; &lt;span class=&quot;project_name&quot;&gt;Подписка&lt;/span&gt; &lt;/div&gt; &lt;div class=&quot;w150 left&quot;&gt; 0.12...

Парсинг html кода страницы
&lt;strong id=&quot;upoints&quot;&gt;0.00&lt;/strong&gt; Есть кусочек кода, из него нужно вытянуть переменную &quot;0.00&quot; в стринг, а лучше в лэйбл. Как это...

Некорректный парсинг html страницы
Добрых времени суток. По этому адресу тык нужно выбрать все что находится в теге &lt;div class=&quot;market_listing_buy_button&quot;&gt;...

Парсинг html кода страницы
Допустим есть некая страница, у которой html &lt;head&gt; &lt;body&gt; &lt;b&gt;ololo&lt;/b&gt; &lt;/body&gt; &lt;/head&gt; мне нужно, поставить if loop...

Html Agility Pack парсинг страницы
Народ, есть код &lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot; id=&quot;vkontakte&quot;&gt;&lt;head&gt; &lt;meta...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru