相对XPath错误地选择循环中的相同元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相对XPath错误地选择循环中的相同元素相关的知识,希望对你有一定的参考价值。
我在抓一些数据。
我需要的一个数据点是日期,但包含此数据的表格单元格仅包括月份和日期。幸运的是,这一年被用作对表格进行分类的标题元素。
由于某种原因,year = table.find_element(...)
为每次迭代选择相同的元素。
我希望year = table.find_element(...)
选择相对于每个独特的table
元素的独特元素,因为它遍历所有元素,但事实并非如此。
实际产出
# random, hypothetical values
Page #1
element="921"
element="921"
element="921"
...
Page #2
element="1283"
element="1283"
element="1283"
...
预期产出
# random, hypothetical values
Page #1
element="921"
element="922"
element="923"
...
Page #2
element="1283"
element="1284"
element="1285"
...
为什么以下代码为每个页面上的每次迭代选择相同的元素?
# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver import Firefox
from selenium.webdriver.common.by import By
links_sc2 = [
'https://liquipedia.net/starcraft2/Premier_Tournaments',
'https://liquipedia.net/starcraft2/Major_Tournaments',
'https://liquipedia.net/starcraft2/Minor_Tournaments',
'https://liquipedia.net/starcraft2/Minor_Tournaments/HotS',
'https://liquipedia.net/starcraft2/Minor_Tournaments/WoL'
]
ff = webdriver.Firefox(executable_path=r'C:\WebDriver\geckodriver.exe')
urls = []
for link in links_sc2:
tables = ff.find_elements(By.XPATH, '//h2/following::table')
for table in tables:
try:
# premier, major
year = table.find_element(By.XPATH, './preceding-sibling::h3/span').text
except:
# minor
year = table.find_element(By.XPATH, './preceding-sibling::h2/span').text
print(year)
ff.quit()
答案
你需要使用./preceding-sibling::h3[1]/span
从context元素(你的表)中获取最近的h3
兄弟。
preceding-sibling
的工作方式如下:
./preceding-sibling::h3
将返回DOM命令中的第一个h3
兄弟,这是2019年。- 但是如果你使用索引,那么
./preceding-sibling::h3[1]
将从context元素返回最近的h3
元素,并且进一步索引到达与DOM顺序相反的下一个匹配。你也可以使用./preceding-sibling::h3[last()]
去获得最远的兄弟姐妹。
以上是关于相对XPath错误地选择循环中的相同元素的主要内容,如果未能解决你的问题,请参考以下文章
如何使用selenium和python创建具有相同xpath的元素列表?
单击具有相同 CssSelector 或相同 XPath FindElements 的所有元素
无法定位元素:python 爬行中的 css 选择器或 xpath
Selenium Xpath元素无法定位 NoSuchElementException: Message: no such element: Unable to locate element(代码片段