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

2024-10-06 16:23:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我为target_html绘制了简单的结构:

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

使用lxml从目标_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解析的Expexted结果:

11 
12 

lxml解析的实际结果:

11 
12     

21 
22 

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


Tags: dividtargetdochtmltable绘制item
1条回答
网友
1楼 · 发布于 2024-10-06 16:23:38

xpath //tr[1]表示选择作为其父元素的第一个子元素(具有该名称)的任何tr元素

选择以下tr是因为它是div的第一个tr子级:

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

选择以下tr是因为它是table的第一个tr子级:

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

要获取第一个匹配项,请首先将xpath括在括号中

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

相关问题 更多 >