0

我无法弄清楚如何使用 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;

现在我正在这样做(上图),但foonull. 我究竟做错了什么?

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

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

2 回答 2

1

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

var foo = from bar in doc.DocumentNode.DescendantNodes()
            where bar.GetAttributeValue("id", null) == "gbqfsa"
            select bar.InnerText;
于 2013-07-24T17:47:49.077 回答
1

你应该做的是:

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

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

如果元素确实具有属性,我将替换Attributes["id"].ValueGetAttributeValue("id", null)不引发异常。id

于 2013-07-24T19:31:56.717 回答