Jsoup选择器语法不能按预期工作

时间:2015-11-28 17:05:28

标签: css-selectors jsoup

对于以下HTML:

<table> 
 <tbody>
  <tr valign="TOP">
   <td align="LEFT"><b>Licensee Name:</b></td>
   <td align="LEFT">Some-last-name Some-first-name</td>
  </tr> 
  <tr valign="TOP">
   <td align="LEFT"><b>License Type:</b></td>
   <td align="LEFT">Optometrist (OPT)</td>
  </tr> 
.
.
.
 </tbody>
</table>

以下代码生成一个空的Elements集合:

Elements rows = docOptometristDetail.select("body > table ~ tr");

但是这段代码有效:

tables = docOptometristDetail.select("body > table");
Elements rows = tables.select("tr");

我期待着代字号运算符:

table ~ tr

要查找<table>元素,请跳过<tbody>元素并构建<tr>元素的集合。

我是否在Jsoup的选择器语法分析器中发现了一个弱点,或者我是否试图违反某些运算符优先规则?

我尝试(body > table) ~ tr,但会抛出SelectorParseException

是否有办法使用单个选择器表达式进行此选择(即获取Elements<tr>元素集合)?

1 个答案:

答案 0 :(得分:1)

在CSS中,代字号~general sibling combinator

选择器table ~ tr将尝试在tr元素之后选择table兄弟元素。由于table元素和tr元素不能成为兄弟元素,因此不会选择任何元素。

理论上,选择器table ~ tr会选择以下tr元素:

<table></table>
<tr></tr> <!-- These 'tr' elements are following siblings of the 'table' -->
<tr></tr> <!-- This is invalid HTML, though. -->

听起来你只需要选择后代,因此body > table tr会起作用。