HtmlAgilityPack - правильно получить второй класс с таким же именем - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу проанализировать некоторые страницы Pikabu.ru, и теперь мне нужно получить общее количество сообщений пользователя.Например, это мой собственный профиль.Мне нужно получить номер «280».https://api.asm.skype.com/v1/objects/0-weu-d6-606eeb4b94e49a4ef8971bec5767e1b0/views/imgpsh_fullsize_anim

Как видите, есть 4 элемента с классом 'profile__digital', поэтому мне нужно проанализировать только третий.

Я написал это:

HtmlNode node = (doc.DocumentNode.Descendants("section").Where(d => d.Attributes["class"].Value.Contains("section_padding_none")).First()); //all is ok
textBox2.Text = node.SelectSingleNode("//span[contains(@class, 'profile__digital')][2]").InnerHtml; //wrong!

Но выдает ArgumentOutOfRange Exception ((. Как правильно разобрать необходимые данные? Пожалуйста, помогите. Спасибо.

1 Ответ

0 голосов
/ 24 сентября 2019

Я не думаю, что использование section_padding_none в качестве якоря для ваших запросов является хорошим.Я думаю, что использование profile__section было бы лучшим выбором.Первым шагом является сужение секций до тех, которые вам нужны (в данном случае это вторая из трех).

//div[contains(@class,'profile__section')][2]
<div class="profile__section">
          <span class="profile__digital hint" aria-label="30&emsp14;685"><b>30К</b> <span><span>рейтинг</span></span></span>
          <span class="profile__digital"><b>2161</b> <span>подписчик</span></span>
          <span class="profile__digital"><b>1940</b> <span>комментариев</span></span>
          <span class="profile__digital"><b>280</b> <span>постов</span></span>
          <span class="profile__digital"><b>103</b> <span>в "горячем"</span></span>
        </div>

Секция организована с использованием интервалов с выделенным значением.Поэтому выберите диапазон с нужным значением (четвертое), а затем жирный тег.

span[contains(@class,'profile__digital')][4]/b

Все это может быть объединено одним выражением xpath.

//div[contains(@class,'profile__section')][2]/span[contains(@class,'profile__digital')][4]/b
...