С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 04.03.2014
Сообщений: 25

Регулярные выражения: распарсить HTML-страницу

18.02.2015, 19:25. Показов 2084. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!
Подскажите, пожалуйста, пытаюсь спарсить с html документа нужную мне строку:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
<tr id="tr_PROPERTY_1">
            <td class="adm-detail-valign-top" width="40%"><span class="adm-required-field">Значение</span>:</td>
            <td width="60%"><select name="PROP[1][]" size="1" ><option value="">(не установлено)</option><option value="1">135</option><option value="2">145</option><option value="3">155</option><option value="4">165</option><option value="5">175</option><option value="6">185</option><option value="7">195</option><option value="8">205</option><option value="9">215</option><option value="10" selected>225</option><option value="11">235</option><option value="12">245</option><option value="13">255</option><option value="14">265</option><option value="15">275</option><option value="16">285</option><option value="17">295</option><option value="18">305</option><option value="19">315</option><option value="20">325</option><option value="1121">31</option><option value="1061">20.5</option><option value="1063">23.5</option><option value="1057">16.0</option><option value="1122">32</option><option value="1066">6.25</option><option value="1069">7.5</option><option value="1058">16.9</option><option value="1052">12.00</option><option value="1050">10.00</option><option value="1065">6.00</option><option value="1070">7.50</option><option value="1062">21.5</option><option value="1125">35</option><option value="1072">9.00</option><option value="1051">11.00</option><option value="1120">30</option><option value="1123">33</option><option value="1059">17.5</option><option value="1124">34</option><option value="1054">14.00</option><option value="1064">28.1</option><option value="1071">8.25</option><option value="1073">9.5</option><option value="1056">16.00</option><option value="1068">7.00</option><option value="1126">36</option><option value="1060">18.0</option><option value="1055">15.00</option><option value="1053">13.00</option><option value="1067">6.50</option></select></td>
        </tr>
 
<tr id="tr_PROPERTY_2">
            <td class="adm-detail-valign-top" width="40%"><span class="adm-required-field">Значение2</span>:</td>
            <td width="60%"><select name="PROP[1][]" size="1" ><option value="">(не установлено)</option><option value="1">135</option><option value="2">145</option><option value="3">155</option><option value="4">165</option><option value="5">175</option><option value="6">185</option><option value="7">195</option><option value="8">205</option><option value="9">215</option><option value="10" selected>225</option><option value="11">235</option><option value="12">245</option><option value="13">255</option><option value="14">265</option><option value="15">275</option><option value="16">285</option><option value="17">295</option><option value="18">305</option><option value="19">315</option><option value="20">325</option><option value="1121">31</option><option value="1061">20.5</option><option value="1063">23.5</option><option value="1057">16.0</option><option value="1122">32</option><option value="1066">6.25</option><option value="1069">7.5</option><option value="1058">16.9</option><option value="1052">12.00</option><option value="1050">10.00</option><option value="1065">6.00</option><option value="1070">7.50</option><option value="1062">21.5</option><option value="1125">35</option><option value="1072">9.00</option><option value="1051">11.00</option><option value="1120">30</option><option value="1123">33</option><option value="1059">17.5</option><option value="1124">34</option><option value="1054">14.00</option><option value="1064">28.1</option><option value="1071">8.25</option><option value="1073">9.5</option><option value="1056">16.00</option><option value="1068">7.00</option><option value="1126">36</option><option value="1060">18.0</option><option value="1055">15.00</option><option value="1053">13.00</option><option value="1067">6.50</option></select></td>
        </tr>
<tr id="tr_PROPERTY_3">
            <td class="adm-detail-valign-top" width="40%"><span class="adm-required-field">Значение3</span>:</td>
            <td width="60%"><select name="PROP[1][]" size="1" ><option value="">(не установлено)</option><option value="1">135</option><option value="2">145</option><option value="3">155</option><option value="4">165</option><option value="5">175</option><option value="6">185</option><option value="7">195</option><option value="8">205</option><option value="9">215</option><option value="10" selected>225</option><option value="11">235</option><option value="12">245</option><option value="13">255</option><option value="14">265</option><option value="15">275</option><option value="16">285</option><option value="17">295</option><option value="18">305</option><option value="19">315</option><option value="20">325</option><option value="1121">31</option><option value="1061">20.5</option><option value="1063">23.5</option><option value="1057">16.0</option><option value="1122">32</option><option value="1066">6.25</option><option value="1069">7.5</option><option value="1058">16.9</option><option value="1052">12.00</option><option value="1050">10.00</option><option value="1065">6.00</option><option value="1070">7.50</option><option value="1062">21.5</option><option value="1125">35</option><option value="1072">9.00</option><option value="1051">11.00</option><option value="1120">30</option><option value="1123">33</option><option value="1059">17.5</option><option value="1124">34</option><option value="1054">14.00</option><option value="1064">28.1</option><option value="1071">8.25</option><option value="1073">9.5</option><option value="1056">16.00</option><option value="1068">7.00</option><option value="1126">36</option><option value="1060">18.0</option><option value="1055">15.00</option><option value="1053">13.00</option><option value="1067">6.50</option></select></td>
        </tr>
Я пытаюсь взять ее регулярными выражениями, вида:
C#
1
2
3
4
5
6
var pattern = string.Format("<tr id=\"tr_PROPERTY_1\">.*</tr>");
                    var matches = Regex.Matches(list, pattern, RegexOptions.Multiline | RegexOptions.Compiled | RegexOptions.IgnoreCase);
                    foreach (Match match in matches)
                    {
                        test=match.Groups[1].Value;
                    }
Но строк совпадения у меня ноль.
Как я понимаю, регулярные выражения обо что-то так сказать "запинаются", но понять обо что - не могу.
Кто может показать в чем я ошибся?
Заранее спасибо!

А вообще, я еще хотел спросить, пока не забыл
Мне нужно из каждого <tr> взять значение
<option value="тут_случайная_цифра" selected>это_значение_нужно_взять</option>
кто может подсказать, взять сразу это значение? Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.02.2015, 19:25
Ответы с готовыми решениями:

Распарсить страницу, используя регулярные выражения
Здравствуйте. Вопрос такой: в программу приходит ответ от сайта: &lt;img width=&quot;12&quot; height=&quot;12&quot;...

Как распарсить строки, используя регулярные выражения
Здравствуйте. есть небольшая проблема, с парсингом через регулярные выражения, в общем, нужно отпарсить выражение: VAR a,b,c; ...

Распарсить Html-страницу
&lt;tr&gt;&lt;th&gt;Адрес&lt;/th&gt;&lt;td&gt; Санкт-Петербург, ул. Мира, д. 3, оф 230 &lt;br&gt;cv bcvbcvb sdfgbsdf Мне надо достать Санкт-Петербург, ул....

11
 Аватар для Katya!
3 / 3 / 4
Регистрация: 27.12.2009
Сообщений: 103
18.02.2015, 19:53
Лучший ответ Сообщение было отмечено Lamzaker как решение

Решение

Цитата Сообщение от Lamzaker Посмотреть сообщение
Мне нужно из каждого <tr> взять значение
<option value="тут_случайная_цифра" selected>это_значение_нужно_взять</option>
кто может подсказать, взять сразу это значение? Заранее спасибо!
C#
1
var valuesh = Regex.Matches(htmlCode, "<option value=\".*?>(.*)</option>");
1
1 / 1 / 0
Регистрация: 04.03.2014
Сообщений: 25
18.02.2015, 19:57  [ТС]
Katya!, спасибо!
Но, если у меня много повторов таких значений, а мне надо взять именно selected из определенного блока tr?
0
 Аватар для Katya!
3 / 3 / 4
Регистрация: 27.12.2009
Сообщений: 103
18.02.2015, 20:33
Лучший ответ Сообщение было отмечено Lamzaker как решение

Решение

Цитата Сообщение от Lamzaker Посмотреть сообщение
Но, если у меня много повторов таких значений, а мне надо взять именно selected из определенного блока tr?
В итоге будет выглядеть как-то так:
C#
1
2
3
            string property = Regex.Match(list, "<tr id=\"tr_PROPERTY_1\">[\\s\\n]+(.*\\s+.*)\\s.*<\\/tr>");
            var values = Regex.Matches(property, "<option value=\".+?\" selected>(.*?)<\\/option>");
            foreach (Match value in values) Console.WriteLine(value);
1
1 / 1 / 0
Регистрация: 04.03.2014
Сообщений: 25
18.02.2015, 20:59  [ТС]
Katya!, Спасибо большое!
А если мне надо взять значение value, я беру в скобки ".+?"
Получается следующая картина
C#
1
2
3
string property = Regex.Match(list, "<tr id=\"tr_PROPERTY_1\">[\\s\\n]+(.*\\s+.*)\\s.*<\\/tr>");
            var values = Regex.Matches(property, "<option value=\"(.+?)\" selected>.*?<\\/option>");
            foreach (Match value in values) Console.WriteLine(value);
Но никакое значение у меня не находит(Count = 0)
Я все-таки что-то не понимаю, В скобках переменная берется?
Как сделать тогда?
0
 Аватар для Katya!
3 / 3 / 4
Регистрация: 27.12.2009
Сообщений: 103
18.02.2015, 21:06
Цитата Сообщение от Lamzaker Посмотреть сообщение
Но никакое значение у меня не находит(Count = 0)
Я все-таки что-то не понимаю, В скобках переменная берется?
Как сделать тогда?
Скинь в архиве проект и файл html
0
1 / 1 / 0
Регистрация: 04.03.2014
Сообщений: 25
18.02.2015, 21:17  [ТС]
Katya!, значение property находит, все отлично, а вот второе ломает:
Получается весь код:
Переменная list:
PHP/HTML
1
2
3
4
5
<tr class="heading" id="tr_IBLOCK_ELEMENT_PROP_VALUE"><td colspan="2">Значения свойств:</td></tr>
        <tr id="tr_PROPERTY_1">
            <td class="adm-detail-valign-top" width="40%"><span class="adm-required-field">Ширина</span>:</td>
            <td width="60%"><select name="PROP1" size="1" ><option value="">не установлено</option><option value="1">135</option><option value="2">145</option><option value="3">155</option><option value="4">165</option><option value="5">175</option><option value="6">185</option><option value="7">195</option><option value="8">205</option><option value="9">215</option><option value="10">225</option><option value="11">235</option><option value="12">245</option><option value="13">255</option><option value="14">265</option><option value="15" selected>275</option><option value="16">285</option><option value="17">295</option><option value="18">305</option><option value="19">315</option><option value="20">325</option><option value="1121">31</option><option value="1061">20.5</option><option value="1063">23.5</option><option value="1057">16.0</option><option value="1122">32</option><option value="1066">6.25</option><option value="1069">7.5</option><option value="1058">16.9</option><option value="1052">12.00</option><option value="1050">10.00</option><option value="1065">6.00</option><option value="1070">7.50</option><option value="1062">21.5</option><option value="1125">35</option><option value="1072">9.00</option><option value="1051">11.00</option><option value="1120">30</option><option value="1123">33</option><option value="1059">17.5</option><option value="1124">34</option><option value="1054">14.00</option><option value="1064">28.1</option><option value="1071">8.25</option><option value="1073">9.5</option><option value="1056">16.00</option><option value="1068">7.00</option><option value="1126">36</option><option value="1060">18.0</option><option value="1055">15.00</option><option value="1053">13.00</option><option value="1067">6.50</option></select></td>
        </tr>
C#
1
2
3
Match regular = Regex.Match(list, "<tr id=\"tr_PROPERTY_1\">[\\s\\n]+(.*\\s+.*)\\s.*<\\/tr>");
                    var values = Regex.Matches(regular.Value, "<option value=\"(.+?)\" selected>.*?<\\/option>", RegexOptions.RightToLeft);
                    foreach (Match value in values) sort = value.Value;
Прошу прощения, что без архива
0
 Аватар для Katya!
3 / 3 / 4
Регистрация: 27.12.2009
Сообщений: 103
18.02.2015, 21:32
Цитата Сообщение от Lamzaker Посмотреть сообщение
значение property находит, все отлично, а вот второе ломает:
Ты хочешь из <tr id="tr_PROPERTY_1">.....</tr> получить коллекцию <option value="тут_случайная_цифра" selected>это_значение_добавляем_в_коллек цию</option>?
То есть в твоем html коде в коллекцию должно добавиться значение 275 из <option value="15" selected>275</option>, я правильно понимаю?
0
1 / 1 / 0
Регистрация: 04.03.2014
Сообщений: 25
18.02.2015, 22:09  [ТС]
Katya!, нет, мне нужно значение 15.
Блин, как-то даже не ловко становится, прощу прощения что запутал Вас.

Добавлено через 33 минуты
Глупо конечно, но все-таки исправил:
C#
1
2
3
regular = Regex.Match(list, "<tr id=\"tr_PROPERTY_1\">[\\s\\n]+(.*\\s+.*)\\s.*<\\/tr>");
                    var values = Regex.Matches(regular.Groups[1].Value, "<option value=\"(.+?)\" selected>.*?<\\/option>", RegexOptions.RightToLeft);
                    foreach (Match value in values) sort = value.Groups[1].Value;
Katya!, прошу прощения за мои глупые вопросы, большое спасибо за подсказку!
0
 Аватар для Katya!
3 / 3 / 4
Регистрация: 27.12.2009
Сообщений: 103
18.02.2015, 22:36
Цитата Сообщение от Lamzaker Посмотреть сообщение
нет, мне нужно значение 15.
Читает код из файла index.html и записывает его в переменную list. Далее получаем значение, на примере Вашего html кода, как раз 15.
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
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
 
namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string path = @"index.html";
            string list = string.Empty;
            if (File.Exists(path))
            {
                list = File.ReadAllText(path, Encoding.Default);
                list = list.Replace(Environment.NewLine, " "); //таким образом удаляем переносы строк
                list = Regex.Replace(list, " {2,}", ""); //если пробелы встречаются 2 раза подряд и более - заменяем на одиночный пробел     
            }
            else return;
            var property = Regex.Match(list, "<tr id=\"tr_PROPERTY_1\">(.*)<\\/tr>").ToString();
            var values = Regex.Matches(property, "<option value=\"(\\d+)\" selected>\\d+<\\/option>");
            foreach (Match value in values) Console.WriteLine(value.Groups[1].Value);
            Console.ReadKey();
        }
    }
}
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
19.02.2015, 09:51
Парсить html регулярками не очень круто, когда есть HtmlAgilityPack.
Основное преимущество первых - в скорости, в остальном я бы выбрал HtmlAgilityPack
0
 Аватар для Katya!
3 / 3 / 4
Регистрация: 27.12.2009
Сообщений: 103
19.02.2015, 12:27
Если решишь использовать HtmlAgilityPack, тогда установи для Google Chrome расширение XPath Helper, очень помогает. Сочетание клавиш CTRL+Shift+X вызывает меню для открытой страницы, зажимаешь Shift и наводишь мышкой на элемент, который ты хочешь получить - в окне Query формируется xpath.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.02.2015, 12:27
Помогаю со студенческими работами здесь

Распарсить Html-страницу
Здравствуйте уважаемые форумчане, Прошу вашей помощи. Вот код моей программки: using System; using...

Как распарсить HTML-страницу
Пытаюсь спарсить содержимое href Облазил кучу сайтов, перепробовал кучу вариантов... не работает Собственно нужно.... загрузить...

Как оптимально распарсить большую HTML страницу и получить нужные данные
&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt; &lt;html dir=&quot;ltr&quot;&gt; &lt;head&gt; &lt;title&gt;фото.галерея | На других посмотреть и...

Регулярные выражения и HTML
Собственно нужно вытащить данные. Из таблицы.. Вот код строки &lt;tr&gt; &lt;td class=&quot;drawing&quot;&gt; &lt;a...

Регулярные выражения. Извлечь из html текст между двумя тегами
Ломаю голову с регулярными выражениями, не получается корректно решить простую задачу: Нужно извлечь из html текст между двумя тегами, но...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru