使用HTML Agility Pack解析表单

我正在尝试从表单中提取所有输入元素。 当我解析以下表格时:

一切都运行得很好,HTML Agility Pack能够检测表单中的输入元素,但如果它有如下所示的div父节点,则不会被检测到。

 

我正在使用以下代码

 HtmlNode.ElementsFlags.Remove("form"); foreach (HtmlAgilityPack.HtmlNode node in postForm.Elements("input")) { HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"]; } 

谁能告诉我出了什么问题? 谢谢

HtmlNode.Elements方法获取匹配名称的第一代子节点。 将输入放在

标记内后,它们将成为表单元素的第二代子节点。

要使代码工作,请使用HtmlNode.Descendants方法,该方法获取具有匹配名称的所有后代节点:

 foreach (HtmlAgilityPack.HtmlNode node in postForm.Descendants("input")) { HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"]; } 

我不记得“ .Elements() ”做了什么,但我认为它只返回子节点……在你的情况下,你的Form的直接子节点是divs

您可以使用XPATH进行更多控制:

 .SelectNodes("//form/div/input") 

这将返回表单中的输入节点列表,知道输入带有div标签。

在这里,您可以看到带有示例的XPATH TUTORIAL

使用Descendants()而不是Elements() – 后者仅适用于直接子节点,但您的输入元素嵌套在div中:

  foreach (HtmlAgilityPack.HtmlNode node in postForm.Descendants("input")) { HtmlAgilityPack.HtmlAttribute valueAttribute = node.Attributes["value"]; }