当前位置: 首页 > 知识库问答 >
问题:

当元素的顺序改变时,通过xpath提取元素(甚至相对xpath也在改变)

袁骏祥
2023-03-14

我试图从一个带有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:没有这样的元素:无法找到元素:{“方法”:“xpath”,“选择器”:“/*[@id=“twocols”]/tbody/tr/td[2]/table/tbody/tr[7]/td[2]”}

xpath末尾的节点tr[7]变为tr[6],因为有时会在页面中添加一个额外的元素。

我要提取的超文本标记语言数据是如下所示的网页日期。

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

即使真实xpath不断变化,我如何做到这一点?

提前感谢

共有1个答案

杜楚
2023-03-14

我的期望是,您应该知道要提取的值的列名。因此,与其硬编码列索引,不如计算“有趣”列的索引。可以使用count()函数和前面的同级轴组合来完成:

例如,给出下表:

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

您可以获得:

  • Smithas//table/tr[2]/td[count(//table/tr/th[.='Lastname']/previous sibling::th)1]
  • Jacksonas//table/tr[3]/td[count(//table/tr/th[.='Lastname']/previous sibling::th)1]
  • Jillas//table/tr[2]/td[count(//table/tr/th[.='Firstname']/前面的兄弟姐妹::th)1]
  • 等等

更多信息:

 类似资料:
  • 嗨,我一直在到处寻找一个非常简单的解释,如何通过xPath找到一个元素。 我想要的只是一种简单的方法来寻找一个元素,但是我想要找到的所有帮助都需要一个。这对我不管用。以下是我想做的: 加载URL 这是我的代码: 当我执行 我得到未定义时,我做 有没有更简单的方法来获取元素?也许是。。。。

  • 请帮助我,我正在尝试选择一个图片,这是一个链接(一个网站上的培训师) 这是我的代码:

  • 我是DOM查询的新手,我想知道是否可以通过Xpath直接查询DOM元素,类似于下面提到的代码? 谢谢

  • 我想从网站上提取一些赔率: https://www.oddsportal.com/soccer/europe/champions-league-2015-2016/real-madrid-manchester-city-dhjzn1pn/#1x2;2

  • 我需要点击下面的href元素,它存在于类似的href元素中。 有人能给我提供xpath来点击上面的href链接吗?提前谢谢你的帮助

  • HTML部分: 下面是我正在尝试的Xpath: 但是得到例外: 无效的选择器:由于以下错误,无法找到 xpath 表达式为 //li[文本()=//li[. = 'admin'] 的元素: 语法错误:未能对“Document”执行“evaluate”:字符串“//li[text()=//li[。= 'admin']'不是有效的XPath表达式。 精确查看UI和超文本标记语言代码: 该字段会自动完成