我在使用html敏捷时遇到了问题。 我偶然发现了一个img src / img alt我需要获取数据。
当我只需要一个东西来获取我的数据时,一切都很好,但是当有更多内容时,它会在集合中找到所有内容,但是所采集的数据总是来自集合中的第一个节点......
HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//div[@class='listHolder']//article[@class='brochure openBrochureAction']//div[@class='imgBrochure']");
foreach (HtmlNode node in collection)
{
//Tried these examples:
NomeFolheto = node.SelectSingleNode("//div[@class='imageRatioHorizontal']//img[@alt]").GetAttributeValue("alt", "none").Trim();
string testeNome = node.SelectSingleNode("//div[@class='imageRatioHorizontal']//img/@alt").Attributes["alt"].Value;
string testeimagem = node.SelectSingleNode("//div[@class='imageRatioHorizontal']//img/@src").Attributes["src"].Value;
imagem = node.SelectSingleNode("//div[@class='imageRatioHorizontal']//img[@src]").GetAttributeValue("src", "none").Trim();
}
就像我说的那样,集合找到它应该的所有节点,并正确获取第一个值,但是当它用于其他节点时,它获得的值来自第一个节点。
我做错了什么?我去检查集合中的每个节点,他们有相同的" alt"像它应该和不同的属性" src"属性就像他们应该的那样,但我知道因为我调试了它每次都拿起第一个节点。
提前致谢
答案 0 :(得分:2)
您的xpath表达式都是从(文档的)根开始的。即使您有对单个节点的引用,它仍然只是对整个树中该节点的引用。
您应该使用.//
表达式:
HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//div[@class='listHolder']//article[@class='brochure openBrochureAction']//div[@class='imgBrochure']");
foreach (HtmlNode node in collection)
{
//Tried these examples:
NomeFolheto = node
.SelectSingleNode(".//div[@class='imageRatioHorizontal']//img[@alt]")
.GetAttributeValue("alt", "none").Trim();
string testeNome = node
.SelectSingleNode(".//div[@class='imageRatioHorizontal']//img/@alt")
.Attributes["alt"].Value;
string testeimagem = node
.SelectSingleNode(".//div[@class='imageRatioHorizontal']//img/@src")
.Attributes["src"].Value;
imagem = node
.SelectSingleNode(".//div[@class='imageRatioHorizontal']//img[@src]")
.GetAttributeValue("src", "none").Trim();
}