我无法弄清楚如何使用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;
答案 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
属性,则不会抛出异常。