1 / 1 / 1
Регистрация: 21.12.2013
Сообщений: 38

Парсинг сайта

12.01.2017, 10:34. Показов 2416. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте. Помогите пожалуйста решить следующую проблему. При парсинге я выбираю информацию по определенному классу в HTML, например w1. Но выбираются все значения с классом w1 и содержащими 1, например w11, w12 и т.д. Как сделать, чтобы выбирались значения только с w1?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var trList = doc.DocumentNode.SelectNodes("//tr");
            foreach (var tr in trList)
            {
                if (tr.Attributes["class"].Value.Contains("w1") && tr.Attributes["class"] != null)
                {
                    if (tr.ChildNodes != null)
                    {
                        foreach (var td in tr.ChildNodes)
                            if (td.Name == "td")
                                Console.WriteLine(td.InnerText);
                    }
                }
 
            }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.01.2017, 10:34
Ответы с готовыми решениями:

Парсинг сайта
Имеется страница с примерно следующим содержимым ... <div class="main random"> <b>1</b> <b>123</b> ...

Парсинг с сайта
Здравствуйте. Не могу никак понять, как парсить "неопределённую" информацию с сайта. Вот допустим количество блогов на cyberforum'е...

Парсинг сайта
Добрый вечер, вопрос в следующем. Имеется веб-странича, фрагмент ее под первым спойлером <td class="sell...

5
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
12.01.2017, 11:55
BronsonAG, в условии поменяйте местами проверки - можете словить NullReferenceException, если атрибут "class" отсутствует у текущего анализируемого узла.

А в идеале лучшее вообще так (проще для отладки и нагляднее):

C#
1
2
3
4
5
HtmlAttribute classAttribute = tr.Attributes["class"];
if ((classAttribute != null) && (classAttribute.Value == "w1")) // <<< вот тут, проверка на равенство, а не Contains
{
   // do something
}
0
1 / 1 / 1
Регистрация: 21.12.2013
Сообщений: 38
12.01.2017, 12:27  [ТС]
bax_tang, Дело в том, что в классе может находиться не одно значение, а несколько, например w1 w3 w4 и еще дополнительные символы.

Пример кода HTML
HTML5
1
<tr class="w3 w4 w9 sad34e0f6">
В том коде, который вы мне написали, четко проверяется содержание атрибута class, т.е. есть ли данная строка, а не ее какое-либо вхождение.
0
.NET senior
 Аватар для bax_tang
441 / 359 / 137
Регистрация: 23.09.2016
Сообщений: 980
12.01.2017, 12:50
BronsonAG, значит, стоит подумать над дополнительными критериями отбора, чтобы пропускать узлы w11, w12 и т.д.
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
12.01.2017, 13:06
Лучший ответ Сообщение было отмечено BronsonAG как решение

Решение

BronsonAG, проверку на наличие атрибута class можно вообще не выполнять, если в XPath задать условие, что этот атрибут должен присутствовать //tr[@class]. Что касается проверки на наличие определенного класса, то можно значение атрибута просто сплитнуть по пробельным литерам и проверять наличие нужного класса в полученном массиве.
C#
1
2
3
4
if(classAttribute.Value.Split(" \r\n\t".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).Contains("w1"))
{
 
}
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18311 / 14235 / 5368
Регистрация: 17.03.2014
Сообщений: 28,905
Записей в блоге: 1
12.01.2017, 17:17
BronsonAG, это можно только с помощью XPath запроса //tr[contains(concat(' ', normalize-space(@class), ' '), ' w1 ')] (пробелы вокруг имени класса важны!). Плюс раз ты еще выбираешь td, то можно добавить и его для упрощения кода - //tr[contains(concat(' ', normalize-space(@class), ' '), ' w1 ')]/td
C#
1
2
3
4
5
6
7
8
var nodes = doc.DocumentNode.SelectNodes("//tr[contains(concat(' ', normalize-space(@class), ' '), ' w1 ')]/td");
if (nodes != null)
{
    foreach (HtmlNode node in nodes)
    {
        Console.WriteLine(node.InnerText);
    }
}
Еще одно решение это использовать CSS селекторы. HtmlAgilityPack их не поддерживает, но есть библиотеки которые добавляют их поддержку. Например, HtmlAgilityPack.CssSelectors).
Небольшое предупреждение
На момент написания данного поста версия HtmlAgilityPack - 1.4.9.5. Библиотека же HtmlAgilityPack.CssSelectors откомпилирована под версию 1.4.9.0 и при компиляции идет перезапись библиотеки. Соотвественно нужно устанавливать старую версию HAP или копировать более новую в post build событии. В этом случае в файле конфигурации нужно указать binding redirect
XML
1
2
3
4
5
6
7
8
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="HtmlAgilityPack" publicKeyToken="bd319b19eaf3b43a" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.4.9.5" newVersion="1.4.9.5" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

Выборка с помощью этой библиотеки выглядит так:
C#
1
2
3
4
5
6
7
8
var nodes = doc.DocumentNode.QuerySelectorAll("tr.w1 td");
if (nodes != null)
{
    foreach (HtmlNode node in nodes)
    {
        Console.WriteLine(node.InnerText);
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.01.2017, 17:17
Помогаю со студенческими работами здесь

Парсинг сайта
Хочу пропарсить сайт, на котором через некоторое время появляются элементы в виде div-ов. Эти дивы мне и нужно получить. Их там много может...

Парсинг Сайта
Товарищи эксперты, помогите решить проблему с парсингом. Есть сайт tv.mail.ru, при разборе кода выявил свойство &lt;div...

Парсинг сайта
Прикладываю файл проекта(украден где-то на форуме)(). ВОт ссылка на страницу - годовой отчет банка....

Парсинг сайта
Здравствуйте. Подскажите пожалуйста. Есть необходимость получать данные со страниц сайта, нажимать там на кнопки, вводить данные. Только...

Парсинг с сайта
Здравствуйте. Не могу понять, как правильно спарсить: название, картинку,описание и версию. Буду благодарен за любую помощь. ...


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

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

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru