相对XPath错误地选择循环中的相同元素

问题描述 投票:3回答:1

我在抓一些数据。

我需要的一个数据点是日期,但包含此数据的表格单元格仅包括月份和日期。幸运的是,这一年被用作对表格进行分类的标题元素。

由于某种原因,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()
python python-3.x selenium xpath web-scraping
1个回答
1
投票

你需要使用./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()]去获得最远的兄弟姐妹。
© www.soinside.com 2019 - 2024. All rights reserved.