【问题标题】:HTML agility parsing errorHTML 敏捷解析错误
【发布时间】:2013-12-22 19:05:41
【问题描述】:

HTML

    <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.

我想要的是按出现的顺序一一访问 id=form1 的表单标签的子节点。我在 chrome 开发人员控制台中尝试了相同的 xpath,它完全按照我想要的方式工作。 HTMlAgility 包是否在从文件或 Web 读取 html 时遇到问题。

【问题讨论】:

  • 问题是什么?
  • 我想要 htmlNodecollection 中的 Forms 标签的所有子节点。

标签: c# html-agility-pack


【解决方案1】:

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

尝试在文档开头添加 doctype(和 xml 命名空间)并将输入元素的结束标记从 > 更改为 />

【讨论】:

  • &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;&lt;html&gt; &lt;head&gt; &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt; &lt;title&gt;Sample Page&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;form action="demo_form.asp" id="form1" method="get"&gt; First name: &lt;input type="text" name="fname"/&gt;&lt;br/&gt; Last name: &lt;input type="text" name="lname"/&gt;&lt;br/&gt; &lt;input type="submit" value="Submit"/&gt; &lt;/form&gt; &lt;/body&gt; &lt;/html&gt;validator.w3.org/check 验证:通过。但得到同样的错误。 :(
【解决方案2】:

在加载文档之前尝试添加以下语句:

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

【讨论】:

  • :D 哈哈谢谢。那行得通。我想我已经定期更新我的 htmlagility dll。
  • nuget ftw ;) -> 是的,它只存在于 v 1.4.5 之后,当前版本是 1.4.6。很高兴为您提供帮助。
猜你喜欢
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多