2013-12-22 114 views
1

HTMLHTML敏捷解析错误

<html> 
<head> 
<title>Sample Page</title> 
</head> 
<body> 
<form action="demo_form.asp" id="form1" method="get"> 
    First name: <input type="text" name="fname"><br> 
    Last name: <input type="text" name="lname"><br> 
    <input type="submit" value="Submit"> 
</form> 
</body> 
</html> 

代码

HtmlDocument doc = new HtmlDocument();  
doc.LoadHtml(File.ReadAllText(@"C:\sample.html")); 
HtmlNode nd = doc.DocumentNode.SelectSingleNode("//form[@id='form1']"); 
//nd.InnerHtml is "". 
//nd.InnerText is "". 

问题

nd.ChildNodes //Collection(to get all nodes in form) is always null. 
nd.SelectNodes("/input") //returns null. 
nd.SelectNodes("./input") //returns null. 
"//form[@id='form1']/input" //returns null. 

我想是一个以访问形式的标签的childNodes使用id = form1的一个发生。我在Chrome开发者控制台中尝试了相同的xpath,它的工作方式与我想要的完全一样。 HTMlAgility包在从文件或Web阅读HTML时遇到问题。

+0

问题是什么? –

+0

我想要htmlNodecollection中的所有表单标签的子节点。 –

回答

0

尝试加载该文件之前添加以下语句:

HtmlNode.ElementsFlags.Remove("form"); 

HtmlAgilityPack的默认行为将所有表单的内部元素添加为兄弟而不是子级。上面的语句改变了这种行为,以便它们(意味着输入标签)将显示为子节点。

您的代码应该是这样的:

HtmlNode.ElementsFlags.Remove("form"); 
HtmlDocument doc = new HtmlDocument();  
doc.LoadHtml(File.ReadAllText(@"C:\sample.html")); 
HtmlNode nd = doc.DocumentNode.SelectSingleNode("//form[@id='form1']"); 
etc... 

引用:

  1. 错误问题&修复:http://htmlagilitypack.codeplex.com/workitem/23074
  2. CodePlex网站论坛上发帖:http://htmlagilitypack.codeplex.com/discussions/247206
+1

:D哈哈谢谢你,这工作,我想我已经定期更新我的htmlagility dll –

+0

nuget ftw;) - >是的,它只是从1.4.5版本开始,现在的版本是1.4.6。乐意效劳。 –

1

您的html无效,可能会阻止html敏捷包正常工作。

尝试从>添加一个DOCTYPE(和XML命名空间)到文档的开始,改变你的输入元素的结束标记/>

+0

<!DOCTYPE HTML PUBLIC“ - // W3C // DTD HTML 4.01 Transitional // EN”“http://www.w3.org/TR/html4/loose.dtd”> 示例页面 <形式行动= “demo_form.asp” ID = “form1的” 方法= “GET” > 名字:
姓氏:
' 已验证通过http://validator.w3.org/check:通过。但得到同样的错误。 :( –