问题:DOM需要<tbody/>
标签
Firebug,Chrome的开发人员工具,Javascript中的XPath函数以及其他功能都可以在 DOM上运行 ,而不是基本的
HTML源代码 。
HTML的DOM要求表主体标签中包含页脚(
<thead/>,
<tfoot/>)的表头中未包含的所有表行
<tbody/>。因此,如果解析(X)HTML时缺少该标记,浏览器将添加该标记。
tbody即使表未显式定义tbody元素,该元素也会显示给所有表。
另一方面,HTML不一定要求使用该标记:
在
TBODY开始标签总是需要当表包含只有一个表的身体和没有表头或脚的部分除外。
大多数XPath处理器都可以在原始XML上运行
除Javascript外,大多数XPath处理器都在原始XML(而不是DOM)上工作,因此不添加
<tbody/>标签。另外,HTML解析器库(例如tag-soup”显示标记为“ tag-soup”的问题”)和htmltidy仅输出XHTML,而不输出“ DOM-HTML”。
这是在Stackoverflow上发布的常见问题,适用于PHP,Ruby,Python,Java,C#,GoogleDocs(电子表格)以及许多其他问题。
Selenium在浏览器中运行并在DOM上运行-因此不受影响!
重现问题
将Firebug(或Chrome的开发工具)显示的源与通过右键单击并选择“显示页面源”(或在浏览器中调用的名称)或
curlhttp://your.example.org在命令行上使用的源进行比较。后期可能不会包含任何
<tbody/>元素(很少使用),Firebug将始终显示它们。
解决方案1:删除/tbody
轴步
检查您所停留的表是否确实不包含
<tbody/>元素(请参阅最后一段)。如果是这样,您可能还会遇到另一种问题。
现在删除
/tbody轴步,这样您的查询将类似于
//table[@id="example"]/tr[2]/td[1]
解决方案2:跳过<tbody/>
标签
这是一个很脏的解决方案,对于嵌套表可能会失败(可以跳入内部表)。我只会在极少数情况下建议这样做。
用
/tbody后代或自身步骤替换轴步骤:
//table[@id="example"]//tr[2]/td[1]
解决方案3:允许输入带<tbody/>
标签和不带标签
如果您不确定事先确定您的表或在“HTML源”和DOM上下文中都使用查询,请执行以下操作:并且不希望/不能使用解决方案2中的技巧,请提供替代查询(针对XPath1.0)或使用“可选的”轴步(XPath 2.0及更高版本)。
XPath 1.0 :
//table[@id="example"]/tr[2]/td[1] |//table[@id="example"]/tbody/tr[2]/td[1]
XPath 2.0 :
//table[@id="example"]/(tbody, .)/tr[2]/td[1]



