为什么这两个 tr 被 lxml 解析为相同的第一个 tr?

Why the two trs were parsed as just the same first tr by lxml?

我画的是target_html的简单结构:

table--div--tr[id="tr1"]
     |--tr[id="tr2"]
     |--tr[id="tr3"]
     |--tr[id="tr4"]

使用 lxml 从 target_html 中提取第一个 tr。

target_html="""
<table id="t1"> 
<div id="div1"> 
<tr id="tr1"> 
<td>11</td> 
<td>12</td> 
</tr> 
</div> 

<tr id="tr2">
<td>21</td> 
<td>22</td> 
</tr>

<tr id="tr3"> 
<td>31</td> 
<td>32</td> 
</tr> 

<tr id="tr4"> 
<td>41</td> 
<td>42</td> 
</tr> 
</table> """

doc=lxml.html.fromstring(target_html)
for item in doc.xpath('//tr[1]'):
    print(item.text_content())

lxml解析的扩展结果:

11 
12 

lxml解析的真实结果:

11 
12     

21 
22 

为什么两个 tr 被解析为 tr[1]

xpath //tr[1] 表示 select 任何 tr 元素,即其 parent 的第一个 child 元素(具有该名称)。

以下 tr 被 select 编辑,因为它是 div 的第一个 tr child:

<tr id="tr1"> 
<td>11</td> 
<td>12</td> 
</tr>

以下 tr 被 select 编辑,因为它是 table 的第一个 tr child:

<tr id="tr2">
<td>21</td> 
<td>22</td> 
</tr>

要抓住第一次出现的地方,首先将 xpath 包装在 parentheses...

doc.xpath('(//tr)[1]')