Относительный XPath неправильно выбирает один и тот же элемент в цикле - PullRequest
0 голосов
/ 21 февраля 2019

Я собираю некоторые данные.

Одна из нужных мне точек данных - это дата, но ячейки таблицы, содержащие эти данные, включают только месяцы и дни.К счастью, год используется как элемент заголовка для классификации таблиц.

По какой-то причине 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()

1 Ответ

0 голосов
/ 21 февраля 2019

Вам нужно использовать ./preceding-sibling::h3[1]/span, чтобы получить ближайшего брата h3 из элемента контекста (вашей таблицы).

preceding-sibling работает следующим образом:

  • ./preceding-sibling::h3 вернет первого h3 родного брата в DOM-порядке, для вас это будет год 2019.

  • Но если вы используете индексирование, то ./preceding-sibling::h3[1] вернетближайший элемент h3 из элемента контекста и дальнейшее индексирование достигает следующего соответствия в обратном порядке DOM.Вы также можете использовать ./preceding-sibling::h3[last()] пойти и получить самого дальнего брата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...