Селен не находит список разделов с классами?

#python #selenium #selenium-webdriver #selenium-chromedriver

#python #селен #selenium-webdriver #selenium-chromedriver

Вопрос:

Я пытаюсь получить список игр на

 https://www.xbox.com/en-US/live/gold#gameswithgold
  

Согласно консоли разработчика Firefox, кажется, что я нашел правильный класс:https://i.imgur.com/M6EpVDg.png

На самом деле, поскольку есть 3 игры, я должен получить список из 3 объектов с помощью этого кода:https://pastebin.com/raw/PEDifvdX (ожидание, чтобы Seleium мог загрузить страницу)

Но на самом деле Селен говорит, что он не существует:https://i.imgur.com/DqsIdk9.png

Я не понимаю, что я делаю неправильно. Я даже пробовал CSS-селекторы, подобные этому

 listOfGames = driver.find_element_by_css_selector("section.m-product-placement-item f-size-medium context-game gameDiv")
  

По-прежнему ничего. Что я делаю не так?

Ответ №1:

Вы пытаетесь получить три разные игры, поэтому вам нужно указать другой путь к элементу или вы можете использовать какой-то цикл, подобный этому

 i = 1
while i < 4:
    link = f"//*[@id='ContentBlockList_11']/div[2]/section[{i}]/a/div/h3"
    listGames = str(driver.find_element_by_xpath(link).text)
    print(listGames)
    i  = 1 
  

вы можете использовать этот цикл в некоторых местах, где есть небольшие различия в xpath, css или class

таким образом, он будет перебирать веб-элементы один за другим и получать список игр

поскольку вы пытаетесь получить имя, я думаю, вам нужно поставить .text , которое даст вам только имя, и ничего больше

Ответ №2:

Другой вариант с селектором, который не зацикливается и не изменяется — также тот, который меньше зависит от структуры страницы и немного легче читается:

 //a[starts-with(@data-loc-link,'keyLinknowgame')]//h3
  

Вот пример кода:

 from selenium import webdriver
from selenium.common.exceptions import StaleElementReferenceException
    
driver = webdriver.Chrome()
url = f"https://www.xbox.com/en-US/live/gold#gameswithgold"
driver.get(url)
driver.implicitly_wait(10)
listOfGames = driver.find_elements_by_xpath("//a[starts-with(@data-loc-link,'keyLinknowgame')]//h3")
for game in listOfGames:
    try:
        print(game.text)
    except StaleElementReferenceException:
        pass
  

Если вам нужно больше, чем просто заголовок, удалите выделение //h3:

 //a[starts-with(@data-loc-link,'keyLinknowgame')]
  

И добавьте любой дополнительный Xpath, который вы хотите, чтобы сузить круг поиска до содержимого / элементов, которые вам нужны.