我试图使用ruby hpricot库从在线html中提取一些数据。我使用firefox扩展fire bug来获取所选项目的xpath。
生成的xpath表达式中总是有额外的tbody标记。在某些情况下,我必须从表达式中删除tbody标记才能获得结果,而在其他情况下,我必须保留该标记才能获得结果。
我就是不知道什么时候应该保留tbody标签,什么时候不应该。
为了考虑并避免这个问题,使用以下类型的XPath表达式:
/locStep1/locStep2/.../table/YourSubExpression
|
/locStep1/locStep2/.../table/tbody/YourSubExpression
如果table
没有tbody
的子节点,则联合算子(|
)的第二个参数不选择节点,而联合算子的第一个参数选择需要的节点。
或者,如果table
有 tbody
子,则联合运算符的第一个参数不选择节点,而联合运算符的第二个参数选择所需的节点。
最终结果:在两种情况下都选择了所需的节点
对于HTML 4或作为text/HTML的XHTML,解析器总是推断出tbody
元素来包装tr
元素,这些元素是已解析标记中table
元素的直接子元素,这就是为什么在浏览器DOM中,HTML table
总是有包含任何tr
元素的tbody
,并且像Firebug这样的工具为您提供了针对Firefox/Mozilla DOM的路径。我不知道您的Ruby库使用什么样的解析器,也许它使用XML解析器来处理XHTML文档,而XML解析器不推断table
元素的tbody
元素。
如果tbody元素没有明确存在,HTML5总是会添加它——这是处理无效HTML的修复策略的一部分。如果您想处理各种环境,使用table//tr可能是有意义的。