如何使用 HtmlAgilityPack 获取表单中的所有输入元素而不会出现空引用错误

Posted

技术标签:

【中文标题】如何使用 HtmlAgilityPack 获取表单中的所有输入元素而不会出现空引用错误【英文标题】:How to get all input elements in a form with HtmlAgilityPack without getting a null reference error 【发布时间】:2011-01-24 01:23:12 【问题描述】:

示例 html

 <html><body>
     <form id="form1">
       <input name="foo1" value="bar1" />
       <!-- Other elements -->
     </form>
     <form id="form2">
       <input name="foo2" value="bar2" />
       <!-- Other elements -->
     </form>   
 </body></html>

测试代码:

HtmlDocument doc = new HtmlDocument();
doc.Load(@"D:\test.html");
foreach (HtmlNode node in doc.GetElementbyId("form2").SelectNodes(".//input"))

    Console.WriteLine(node.Attributes["value"].Value);            

doc.GetElementbyId("form2").SelectNodes(".//input") 语句给了我一个空引用。

我做错了什么吗?谢谢。

【问题讨论】:

【参考方案1】:

您可以执行以下操作:

HtmlNode.ElementsFlags.Remove("form");

HtmlDocument doc = new HtmlDocument();

doc.Load(@"D:\test.html");

HtmlNode secondForm = doc.GetElementbyId("form2");

foreach (HtmlNode node in secondForm.Elements("input"))

    HtmlAttribute valueAttribute = node.Attributes["value"];

    if (valueAttribute != null)
    
        Console.WriteLine(valueAttribute.Value);
    

默认情况下,HTML Agility Pack 将表单解析为空节点,因为它们允许与其他 HTML 元素重叠。第一行 (HtmlNode.ElementsFlags.Remove("form");) 禁用此行为,允许您在第二个表单中获取输入元素。

更新: 表单元素重叠示例:

<table>
<form>
<!-- Other elements -->
</table>
</form>

元素在表格内部开始,但在表格元素外部结束。这在 HTML 规范中是允许的,HTML Agility Pack 必须处理它。

【讨论】:

这是否意味着,除非您使用HtmlNode.ElementsFlags.Remove("form");,否则无法通过HAP 解析form 元素的子元素? @Kevin,我不知道任何其他选择。 5 年后 - 仍然是一个要求,仍然是正确的答案。另外,仍然应该在包本身中进行更改... 应该是 secondForm.SelectNodes(".//input")) 而不是 secondForm.Elements("input")),否则得不到嵌套的输入元素。【参考方案2】:

只需将它们放入数组中即可:

HtmlNodeCollection resultCollection = doc.DocumentNode.SelectNodes("//*[@type='text']");

【讨论】:

以上是关于如何使用 HtmlAgilityPack 获取表单中的所有输入元素而不会出现空引用错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 HtmlAgilityPack 解析 HTML 页面

获取两个标签之间的内部文本 - VB.NET - HtmlAgilityPack

在 HtmlAgilityPack 中运行脚本

HTMLAgilityPack 获取带有 id 属性的 td 标签的 innerText

htmlagilitypack - 删除脚本和样式?

htmlagilitypack - 删除脚本和样式?