Bil*_* Li 23 html c# parsing html-agility-pack
示例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>
Run Code Online (Sandbox Code Playgroud)
测试代码:
HtmlDocument doc = new HtmlDocument();
doc.Load(@"D:\test.html");
foreach (HtmlNode node in doc.GetElementbyId("form2").SelectNodes(".//input"))
{
Console.WriteLine(node.Attributes["value"].Value);
}
Run Code Online (Sandbox Code Playgroud)
该声明doc.GetElementbyId("form2").SelectNodes(".//input")给了我一个空引用.
我做错了什么?谢谢.
Joã*_*elo 42
您可以执行以下操作:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,HTML Agility Pack将表单解析为空节点,因为它们可以与其他HTML元素重叠.第一行(HtmlNode.ElementsFlags.Remove("form");)禁用此行为,允许您获取第二个表单内的输入元素.
更新: 表单元素重叠的示例:
<table>
<form>
<!-- Other elements -->
</table>
</form>
Run Code Online (Sandbox Code Playgroud)
元素在表格内部开始,但在表格元素外部关闭.这在HTML规范中是允许的,HTML Agility Pack必须处理它.