正如在这个Stack Overflow回答中想象的那样,您需要选择一个特定的表,然后选择它的所有行.由于HTML的允许性,以下所有三个都是合法标记:
<table id="foo"><tr>...</tr></table>
<table id="foo"><tbody><tr>...</tr></tbody></table>
<table id="foo"><tr>...</tr><tbody><tr>...</tr></tbody></table>
Run Code Online (Sandbox Code Playgroud)
您担心嵌套在表中的表,因此不希望使用类似XPath
table[@id="foo"]//tr.
如果您可以将所需的XPath指定为正则表达式,它可能类似于:
table[@id="foo"](/tbody)?/tr
通常,如何指定允许选择器层次结构中的可选元素的XPath表达式?
要清楚,我不是要解决现实问题或选择特定文档的特定元素.我在寻求解决一类问题的技巧.
小智 23
我不明白为什么你不能用这个:
//table[@id='foo']/tr|//table[@id='foo']/tbody/tr
Run Code Online (Sandbox Code Playgroud)
如果你想要一个没有节点集联合的表达式:
//tr[(.|parent::tbody)[1]/parent::table[@id='foo']]
Run Code Online (Sandbox Code Playgroud)
用途:
//table[@id="foo"]/*[self::tbody or self::thead or self::tfoot]/tr
|
//table[@id="foo"]/tr
Run Code Online (Sandbox Code Playgroud)
选择任意tr这是任何一个子元素table有一个id属性"富"或者tr说是一个子元素tbody是一个孩子的任何table.
在XPath 2.0中,可选步骤可表示为(tbody|.).
//table[@id="foo"]/(tbody|.)/tr
Run Code Online (Sandbox Code Playgroud)
pipe(|)表示union(两个节点集),dot(.)表示identity步骤(返回上一步所做的).
这可以扩展为包含更多可选元素:
//table[@id="foo"]/(thead|tbody|tfoot|.)/tr
Run Code Online (Sandbox Code Playgroud)