我只是写了这个测试来看看我是否疯了......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HtmlAgilityPack;
namespace HtmlAgilityPackFormBug
{
class Program
{
static void Main(string[] args)
{
var doc = new HtmlDocument();
doc.LoadHtml(@"
<!DOCTYPE html>
<html>
<head>
<title>Form Test</title>
</head>
<body>
<form>
<input type=""text"" />
<input type=""reset"" />
<input type=""submit"" />
</form>
</body>
</html>
");
var body = doc.DocumentNode.SelectSingleNode("//body");
foreach (var node in body.ChildNodes.Where(n => n.NodeType == HtmlNodeType.Element))
Console.WriteLine(node.XPath);
Console.ReadLine();
}
}
}
它输出:
/html[1]/body[1]/form[1]
/html[1]/body[1]/input[1]
/html[1]/body[1]/input[2]
/html[1]/body[1]/input[3]
但是,如果我改变<form>
to <xxx>
它给了我:
/html[1]/body[1]/xxx[1]
(正如它应该)。所以......看起来那些输入元素是not包含在形式内,但直接在身体内,就好像<form>
就立即关闭了。那是怎么回事?这是一个错误吗?
深入研究源码,我发现:
ElementsFlags.Add("form", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
它有“空”标志,就像 META 和 IMG 一样。为什么??表格绝对是not应该是空的。
这也被报道在这个工作项。它包含 DarthObiwan 建议的解决方法。
您可以更改此设置而无需重新编译。 ElementFlags 列表是
HtmlNode 类的静态属性。可以使用以下命令将其删除
HtmlNode.ElementsFlags.Remove("form");
在进行文档加载之前
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)