Python find_element 在 find_element 的问题第 2 部分?

Python find_element in find_elements problem part 2?

大家好:

我想从url获取数据(抱歉它的编码,因为系统总是报告它是垃圾邮件)

点击篮球后点击日期组合框菜单和select第一个日期……

现在我尝试从菜单中获取所有日期,并希望获取像 yyyy/mm/dd 这样的日期格式。下面是代码

import time

from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException        

driver = webdriver.Chrome()
driver.set_window_size(1500, 1350)

# open url (sorry for the url , cause system always report its a spam)
url1 = "http"
url2 = "888.net/spo"
url3 = "s://web2.sa8"
url4 = "rt/Games.a"
url5 = "evice=pc"
url6 = "spx?lang=3&d"

driver.get(url1 + url3 + url2 + url4 + url6 + url5)

# jump to basketball
locator = (By.XPATH, '//*[@id="menuList"]/div/ul/li[3]/div[2]/a[1]') 
pointer = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(locator),
"element not found"
)
actions = ActionChains(driver)
actions.click(pointer).perform()
time.sleep(1)

# date menu
locator = (By.XPATH, '//*[@id="chooseDate"]')
pointer = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(locator),
"element not found"
)
actions = ActionChains(driver)
actions.click(pointer).perform()

# jump to date 1
locator = (By.XPATH, '//*[@id="dateOption"]/a[2]/span[1]')  # a[2] for second date, because first has no matches
pointer = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(locator),
"element not found"
)
actions = ActionChains(driver)
actions.click(pointer).perform()

# close AD by double clicl
locator = (By.ID, 'btn_close') 
pointer = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(locator),
"element not found"
)
actions = ActionChains(driver)
actions.click(pointer).perform()
actions = ActionChains(driver)
actions.click(pointer).perform()

# wait for date 
locator = (By.XPATH, './/*[@id="dateOption"]')
pointer = WebDriverWait(driver, 10).until(
EC.presence_of_element_located(locator),
"element not found"
)

_dates = driver.find_elements(By.XPATH, './/*[@id="dateOption"]/a[*]')
for date in _dates:
    #date_text = date.find_element(By.XPATH, './/*[@id="dateOption"]/a[*]')
    #_date_text = date.find_element(By.ID, './/*[@id="displayDate"]')
    _date_text = date.find_element(By.XPATH, './/div[@rel="20*"]')
    print(_date_text.text)

time.sleep(120)
driver.quit()

我收到了错误消息

/usr/local/bin/python3 "/Users/andy/Python/sa8888 #5.3 test.py"
andy@Andys-iMac Python % /usr/local/bin/python3 "/Users/andy/Python/sa8888 #5.3 test.py"
Traceback (most recent call last):
  File "/Users/andy/Python/sa8888 #5.3 test.py", line 78, in <module>
    _date_text = date.find_element(By.XPATH, './/div[@rel="20*"]')
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 735, in find_element
    return self._execute(Command.FIND_CHILD_ELEMENT,
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/selenium/webdriver/remote/webelement.py", line 710, in _execute
    return self._parent.execute(command, params)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/selenium/webdriver/remote/webdriver.py", line 424, in execute
    self.error_handler.check_response(response)
  File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/selenium/webdriver/remote/errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":".//div[@rel="20*"]"}
  (Session info: chrome=96.0.4664.110)

enter image description here

我确定 HTML 有我需要的相关日期数据

我应该怎么做才能解决它?

提前致谢

您在这里需要做的就是从 _dates 网络元素列表中提取 rel 属性值。
所以而不是

_dates = driver.find_elements(By.XPATH, './/*[@id="dateOption"]/a[*]')
for date in _dates:
    #date_text = date.find_element(By.XPATH, './/*[@id="dateOption"]/a[*]')
    #_date_text = date.find_element(By.ID, './/*[@id="displayDate"]')
    _date_text = date.find_element(By.XPATH, './/div[@rel="20*"]')
    print(_date_text.text)

你可以这样做:

_dates = driver.find_elements(By.XPATH, './/*[@id="dateOption"]/a[*]')
for date in _dates:
    rel = date.get_attribute("rel")
    print(rel)