当元素的顺序改变时,按xpath提取元素(即使相对的xpath也在改变)

时间:2019-08-06 19:16:23

标签: python selenium

我正在尝试使用如下所示的Xpath从网页中提取文本

//*[@id="twocols"]/tbody/tr/td[2]/table/tbody/tr[6]/td[2]

使用python代码

updatetime=driver.find_element_by_xpath('//*[@id="twocols"]/tbody/tr/td[2]/table/tbody/tr[6]/td[2]').text 

最终会引发以下错误:

NoSuchElementException:否这样的元素:无法找到元素:{“ method”:“ xpath”,“ selector”:“ // * [@ id =” twocols“] / tbody / tr / td [2] / table / tbody / tr [7] / td [2]“}

xpath末尾的节点tr [7]成为tr [6],因为有时在页面中添加了一个附加元素。

我要提取的HTML数据是网页中的日期,如下所示。

<td class="">2019-08-06 16:16 BST</td>  

即使实际的xpath不断变化,我该怎么做?

预先感谢

1 个答案:

答案 0 :(得分:0)

我的期望是,您应该知道要尝试提取的值的列名。因此,与其硬编码列索引,还不如计算“有趣”列的索引。可以使用count() functionpreceding-sibling axis组合来完成:

例如,给出以下table

<table style="width:100%">
    <tr>
        <th>Firstname</th>
        <th>Lastname</th>
        <th>Age</th>
    </tr>
    <tr>
        <td>Jill</td>
        <td>Smith</td>
        <td>50</td>
    </tr>
    <tr>
        <td>Eve</td>
        <td>Jackson</td>
        <td>94</td>
    </tr>
</table>

您可以匹配获取:

  • Smith//table/tr[2]/td[count(//table/tr/th[.='Lastname']/preceding-sibling::th) + 1]
  • Jackson//table/tr[3]/td[count(//table/tr/th[.='Lastname']/preceding-sibling::th) + 1]
  • Jill//table/tr[2]/td[count(//table/tr/th[.='Firstname']/preceding-sibling::th) + 1]

更多信息: