python - 当元素的顺序发生变化时通过xpath提取元素(即使相对xpath也在变化)
问题描述
我正在尝试使用 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 不断变化,我该怎么做?
提前致谢
解决方案
我的期望是你应该知道你试图提取的值的列名。因此,您应该计算“有趣”列的索引,而不是对列索引进行硬编码。可以使用count()
函数和preceding-sibling
轴组合来完成:
例如给出下表:
<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]
- 等等
更多信息:
推荐阅读
- prometheus - 集成 Prometheus、Grafana 和 Azure
- linux - 命令替换:第 72 行:意外标记 `(' 附近的语法错误
- keycloak - 如何通过 keycloak 将 orcid id 获取到我的应用程序中?
- python - Kernel Restarting : 内核似乎已经死机。它会自动重启
- css - 如何消除渲染阻塞资源(app.css)?
- javascript - 每次点击按钮都更改文本?
- azure-devops - DEV-OPS Azure 发布测试结果如果任何测试失败,则在标记“标记为失败”时有两个不同的输出
- python - / 的错误不支持的操作数类型:“str”和“int”
- javascript - 显示用户什么时间(hh.mm.ss)他/她进入网站
- c# - 在 Windows 桌面应用程序和 Chrome 之间切换驱动程序控制