2015-11-28 130 views
1

對於以下HTML:Jsoup選擇語法工作不正常

<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 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元素的集合)?

回答

1

在CSS中,波浪號字符~general sibling combinator

選擇器table ~ tr將試圖選擇繼table元件所述的tr同級元素。由於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會工作。

+0

這是行不通的!謝謝。如果桌子在體內,你可以通過「body> table」進入桌子。因此,如果行在表格內,爲什麼不使用「table> tr」(我曾嘗試過,沒有成功)? – mbmast

+0

@mbmast這是因爲'>'會選擇* direct *子元素,而一個空格會選擇所有的子元素。 'tr'元素不是'table'元素的直接子元素,但是它們是子元素。參見:http://stackoverflow.com/questions/3225891/what-does-the-greater-than-sign-css-selector-mean –