gpt4 book ai didi

c# - HtmlAgilityPack 根据查询过滤 HTML

转载 作者:行者123 更新时间:2023-11-28 00:53:26 24 4
gpt4 key购买 nike

我有两个 HTML 元素 block ,如下所示:

<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&amp;ie=UTF8&amp;qid=1504525216&amp;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 &amp; Save
</a>
</div>

下一个 HTML block :

<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="Prime"

这是我目前提取价格的方式,但效果不佳:

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 元素,就像我展示的第二段 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;

}
}

所以我的想法是,我从 HTML 文件中取出所有“a”元素并创建 a 的 HTML 节点集合,然后遍历它们并查看哪个确实包含我要查找的元素,然后匹配它...?

这里的问题是这个 if 语句总是通过:

 if (pr.ElementAt(i).SelectNodes("//i[@class='a-icon a-icon-prime a-icon-small s-align-text-bottom']").ElementAt(i) != null)

如何遍历节点集合中的每个单独元素?

最佳答案

我认为您应该开始查看 div 级别的 a-row 类。然后循环并检查 div 是否包含 iarea-label 等于“Prime”。最后用 a-color-base sx-zero-spacing 类和属性 aria-label 的值得到 span 像这样:

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;
}
}
}

关于c# - HtmlAgilityPack 根据查询过滤 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46036650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com