HtmlAgilityPack-正确获取具有相同名称的第二类

时间:2019-09-19 18:54:47

标签: c# html-agility-pack

我想解析一些Pikabu.ru页面,现在我需要获取用户的总帖子数。 例如,这是我自己的个人资料。我需要输入“ 280”号。 https://api.asm.skype.com/v1/objects/0-weu-d6-606eeb4b94e49a4ef8971bec5767e1b0/views/imgpsh_fullsize_anim

如您所见,'profile__digital'类有4个元素,因此我只需要解析第三个元素。

我写了这个:

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 :(得分:1)

我认为使用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