【问题标题】:Extract element by xpath when the order of the elements are changing( Even the relative xpath is changing)当元素的顺序发生变化时通过xpath提取元素(即使相对xpath也在变化)
【发布时间】:2019-08-06 19:16:23
【问题描述】:

我正在尝试从具有如下 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 不断变化,我该怎么做?

提前致谢

【问题讨论】:

  • 如果您不提供 html 代码或页面链接,任何人都无法提供帮助。
  • 同意 IPoln​​ik。那是最后一行(6 或 7)吗?如果答案是肯定的,那么试试这个 xpath (//*[@id="twocols"]/tbody/tr/td[2]/table/tbody/tr)[last()]/td[2]
  • 您提供的td 周围将有一些元素将是确定合适选择器的关键。包括周围的html,尤其是祖先,会很有帮助。
  • 这可能只是单引号和双引号的语法问题。试试这个,driver.find_element_by_xpath("//*[@id='twocols']/tbody/tr/td[2]/table/tbody/tr[6]/td[2]")

标签: python selenium


【解决方案1】:

我的期望是你应该知道你试图提取的值的列名。因此,您应该计算“有趣”列的索引,而不是对列索引进行硬编码。可以使用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>

你可以匹配get:

  • 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]

更多信息:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多