使用HTML Agility Pack解析表单

时间:2012-03-27 12:18:25

标签: c# html-agility-pack

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

<form>
<input name='test1' type='text'>
<input name='test2' type='text'>
<input name='test3' type='text'>
</form>

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

<form>
<div><input name='test1' type='text'></div>
<div><input name='test2' type='text'></div>
<div><input name='test3' type='text'></div>
</form>

我正在使用以下代码

HtmlNode.ElementsFlags.Remove("form");

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

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

3 个答案:

答案 0 :(得分:6)

HtmlNode.Elements方法获取匹配名称的第一代子节点。将输入放在<div>标记内后,它们将成为表单元素的第二代子节点。

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

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

答案 1 :(得分:2)

我不记得“.Elements()”做了什么,但我认为它只返回子节点......在你的情况下,你的表格的直接孩子是divs。< / p>

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

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

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

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

答案 2 :(得分:2)

使用Descendants()代替Elements() - 后者仅适用于直接子项,但您的输入元素嵌套在div中:

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