使用HTML Agility Pack遍历DOM

时间:2013-07-24 16:40:25

标签: c# html-agility-pack

我无法弄清楚如何使用HTML Agility Pack遍历DOM。

例如,假设我想找到一个id="gbqfsa"的元素。

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(Url);
            var foo = from bar in doc.DocumentNode.DescendantNodes()
                          where bar.Attributes["id"].Value == "gbqfsa"
                          select bar.InnerText;

现在我正在执行此操作(上图),但foo将以null形式出现。我做错了什么?

编辑:这是我正在使用的if语句。我只是在测试元素InnerText是否等于“Google搜索”。

if (foo.Equals("Google Search"))
            {
                HasSucceeded = 1;
                MessageBox.Show(yay);
            }
            else
            {
                MessageBox.Show("kms");
            }
            return HasSucceeded;

2 个答案:

答案 0 :(得分:1)

我认为foo不会以null形式出现。更可能的是,bar.Attributes["id"]对于树中的某些元素为空,因为并非所有后代节点都具有“id”属性。我建议使用GetAttributeValue方法,如果找不到该属性,将返回默认值。

var foo = from bar in doc.DocumentNode.DescendantNodes()
            where bar.GetAttributeValue("id", null) == "gbqfsa"
            select bar.InnerText;

答案 1 :(得分:1)

你应该做的是:

var foo = (from bar in doc.DocumentNode.DescendantNodes()
          where bar.GetAttributeValue("id", null) == "gbqfsa"
          select bar.InnerText).FirstOrDefault();

您忘记FirstOrDefault()选择满足where条件的第一个元素。

我将Attributes["id"].Value替换为GetAttributeValue("id", null),如果元素确实具有id属性,则不会抛出异常。