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

xpath路径表达式笔记

Selenium Xpath元素无法定位 NoSuchElementException: Message: no such element: Unable to locate element(代码片段

xpath定位方法