问题描述
|
我只是用nekohtml + dom4j解析html文档时遇到了一些问题。
我发现我的xpath表达式不再起作用,因为最近在html源代码中添加了新的默认html xml命名空间。
规格说明:
前缀xmlns仅用于
声明名称空间绑定,由
定义绑定到名称空间名称
http://www.w3.org/2000/xmlns/。它必须
未声明。其他前缀必须
不受此名称空间名称的约束,
并且不得将其声明为
默认名称空间。元素名称必须
没有前缀xmlns。
但是在我的html文档中,最近(我想)在html标签中添加了:xmlns = \“ http://www.w3.org/1999/xhtml \”
我找到2个解决方案:
1)删除名称空间:
DOMParser parser = new DOMParser();
parser.setFeature(\"http://xml.org/sax/features/namespaces\",false);
parser.parse(url);
根据NekoHTML常见问题解答所说。
2)在我的xpath中添加一个前缀,绑定到默认的html名称空间。
(似乎无法将前缀“空字符串”绑定到我想要的名称空间)
Map<String,String> XPATH_NAMESPACES = new HashMap<String,String>();
XPATH_NAMESPACES.put(\"my_prefix\",\"http://www.w3.org/1999/xhtml\");
XPath xpath = document.createXPath(xpathExpr);
xpath.setNamespaceURIs(XPATH_NAMESPACES);
Element element = (Element) xpath.selectSingleNode(document);
然后,我使用// my_prefix:td代替// td
我之所以发布这些解决方案,是因为有些人可能会觉得这篇文章有用。
另请参见http://www.edankert.com/defaultnamespaces.html#Jaxen_and_Dom4J
但是我真正想知道的是:
为什么要使用与以下名称空间不同的名称空间
默认的一个?
为什么有人从http://www.w3.org/2000/xmlns/切换到
http://www.w3.org/1999/xhtml?
为什么我们通常使用w3命名空间?命名空间是否有一些
对浏览器有影响吗?
我想我的问题对某些人来说似乎很明显,但是我并没有真正理解它带来的好处。
我已经了解了html和xhtml之间的区别。我猜想使用xhtml dtd的人宁愿使用此命名空间,但是除了它给爬虫或类似的东西带来更多痛苦之外,真正的兴趣是什么?
PS:我已经看到,要从html传递到xhtml,您必须同时添加xmlns和xml:lang:
因此,由于未添加xml:lang,所以这可能不是我要解析的网站的目的...
谢谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)