由火虫产生的xpath中的Tbody标签

我正在尝试使用ruby hpricot库从在线htmls中提取一些数据。 我使用firefox扩展fire bug来获取所选项目的xpath。

生成的xpath表达式中始终存在额外的tbody标记。 在某些情况下,我必须从表达式中删除tbody标记以获得结果,而在其他情况下,我必须保留标记以获得结果。

我只是无法弄清楚何时保留tbody标签以及何时不能。

为了考虑并避免此问题,请使用以下类型的XPath表达式

/locStep1/locStep2/.../table/YourSubExpression | /locStep1/locStep2/.../table/tbody/YourSubExpression 

如果table没有tbody节点,则union运算符( | )的第二个参数不选择任何节点,并且union的第一个参数选择所需节点。

或者,如果table 具有 tbody节点,则union运算符的第一个参数不选择任何节点,并且union的第二个参数选择所需节点。

最终结果 :在两种情况下都选择了所需节点

使用HTML 4或XHTML作为text / html,解析器总是推断一个tbody元素来包装tr元素,这些元素是解析标记table元素的直接子元素,这就是为什么在浏览器DOM中HTML table总是有的包含任何tr元素的tbody和像Firebug这样的工具为您提供了适用于Firefox / Mozilla DOM的路径。 我不知道你的Ruby库使用什么样的解析器,也许它使用XHTML文档的XML解析器,而XML解析器不会推断table元素的tbody元素。

HTML5总是添加tbody元素,如果它没有明确的 – 它是处理无效HTML的修复策略的一部分。 如果您想要应对各种环境,使用表// tr可能有意义。