当我在不同节点中查看HTML Agility时获得相同的值

时间:2014-08-04 11:13:30

标签: c# visual-studio-2010 html-agility-pack

我在使用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"属性就像他们应该的那样,但我知道因为我调试了它每次都拿起第一个节点。

提前致谢

1 个答案:

答案 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();
}