Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 1
Регистрация: 21.12.2013
Сообщений: 38

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

12.01.2017, 10:34. Показов 2391. Ответов 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
7259 / 2606 / 744
Регистрация: 11.04.2015
Сообщений: 4,150
Записей в блоге: 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
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,898
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru