我有一个包含两个HTML元素的块,如下所示:
<div class="a-row">
<a class="a-size-small a-link-normal a-text-normal" href="/Chemical-Guys-CWS-107-Extreme-Synthetic/dp/B003U4P3U0/ref=sr_1_1_sns?s=automotive&ie=UTF8&qid=1504525216&sr=1-1">
<span aria-label="$19.51" class="a-color-base sx-zero-spacing">
<span class="sx-price sx-price-large">
<sup class="sx-price-currency">$</sup>
<span class="sx-price-whole">19</span>
<sup class="sx-price-fractional">51</sup>
</span>
</span>
<span class="a-letter-space"></span>Subscribe & Save
</a>
</div>
下一个HTML块:
<div class="a-row a-spacing-none">
<a class="a-link-normal a-text-normal" href="https://rads.stackoverflow.com/amzn/click/com/B003U4P3U0" rel="nofollow noreferrer">
<span aria-label="$22.95" class="a-color-base sx-zero-spacing">
<span class="sx-price sx-price-large">
<sup class="sx-price-currency">$</sup>
<span class="sx-price-whole">22</span>
<sup class="sx-price-fractional">95</sup>
</span>
</span>
</a>
<span class="a-letter-space"></span>
<i class="a-icon a-icon-prime a-icon-small s-align-text-bottom" aria-label="Prime">
<span class="a-icon-alt">Prime</span>
</i>
</div>
这两个元素的结构非常相似,但诀窍在于我想提取元素的值,它旁边包含一个带有类的span元素:aria-label =&#34; Prime&#34 ;
这就是我目前如何提取价格,但它并不好:
if (htmlDoc.DocumentNode.SelectNodes("//span[@class='a-color-base sx-zero-spacing']") != null)
{
var span = htmlDoc.DocumentNode.SelectSingleNode("//span[@class='a-color-base sx-zero-spacing']");
price = span.Attributes["aria-label"].Value;
}
这基本上选择位置0的HTML元素,因为有多个元素。但这里的诀窍是我想选择包含主要值的span元素,就像我已经显示的第2条HTML一样...... 如果具有这些值的第二个元素不存在,我只是简单地使用我在那里写的第一个方法......
有人可以帮我解决这个问题吗? =)
我也尝试过这样的事情:
var pr = htmlDoc.DocumentNode.SelectNodes("//a[@class='a-link-normal a-text-normal']")
.Where(x => x.SelectSingleNode("//i[@class='a-icon a-icon-prime a-icon-small s-align-text-bottom']") != null)
.Select(x => x.SelectSingleNode("//span[@class='a-color-base sx-zero-spacing']").Attributes["aria-label"].Value);
但它仍然返回第一个元素xD
新版人:
var pr = htmlDoc.DocumentNode.SelectNodes("//a[@class='a-link-normal a-text-normal']");
string prrrrrr = "";
for (int i = 0; i < pr.Count; i++)
{
if (pr.ElementAt(i).SelectNodes("//i[@class='a-icon a-icon-prime a-icon-small s-align-text-bottom']").ElementAt(i) != null)
{
prrrrrr = pr.ElementAt(i).SelectNodes("//span[@class='a-color-base sx-zero-spacing']").ElementAt(i).Attributes["aria-label"].Value;
}
}
所以我的想法是我把所有的&#34; a&#34; HTML文件中的元素并创建一个HTML节点集合,然后遍历它们,看看哪一个确实包含我正在寻找的元素然后匹配它??
这里的问题是if语句总是通过:
if (pr.ElementAt(i).SelectNodes("//i[@class='a-icon a-icon-prime a-icon-small s-align-text-bottom']").ElementAt(i) != null)
如何循环遍历节点集合中的每个元素?
答案 0 :(得分:1)
我认为您应该开始使用课程div
查看a-row
级别。然后循环并检查div
是否包含i
,其中area-label
类等于&#39; Prime&#39;。最后得到span
类a-color-base sx-zero-spacing
和属性aria-label
的值,如下所示:
HtmlNodeCollection nodes = htmlDoc.DocumentNode.SelectNodes("//div[starts-with(@class,'a-row')]");
foreach (HtmlNode node in nodes)
{
HtmlNode i = node.SelectSingleNode("i[@aria-label='Prime']");
if (i != null)
{
HtmlNode span = node.SelectSingleNode(".//span[@class='a-color-base sx-zero-spacing']");
if (span != null)
{
string currentValue = span.Attributes["aria-label"].Value;
}
}
}