Python find_element find_element 的问题第 3 部分?

Python find_element in find_elements problem part 3?

大家好:

我想从 url 获取数据(抱歉它被编码了,因为在线编辑器总是报告它是垃圾邮件)

单击主菜单的篮球并关闭 AD 然后单击日期组合框菜单和 select 按日期显示日期

现在我的代码尝试每天获取所有数据直到昨天,其中包括以下字段

  1. 日期
  2. 联赛
  3. 时间/状态(取决于奇数或偶数行)
  4. 队/分1~分5/总分

获取所有数据后,将保存到SQL DB

下面是我的代码

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)
delay = 10

# 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, delay).until(EC.presence_of_element_located(locator),"element not found")
actions = ActionChains(driver)
actions.click(pointer).perform()
time.sleep(1)

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

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

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

#_dates = driver.find_elements(By.XPATH, './/*[@id="dateOption"]/a[*]')
date_counter = 1
for date in range(len(_dates)-8): # until yesterday
    # click pull down date menu
    locator = (By.XPATH, './/*[@id="chooseDate"]')
    pointer = WebDriverWait(driver, delay).until(EC.presence_of_element_located(locator), "element not found")
    actions.move_to_element(pointer).perform()
    actions.click(pointer).perform()

    # click date#n
    temp = './/*[@id="dateOption"]/a['+str(date_counter)+']/span[1]'
    #print("XPATH=",temp)
    locator = (By.XPATH, temp)
    pointer = WebDriverWait(driver, delay).until(EC.presence_of_element_located(locator), "element not found")
    actions.move_to_element(pointer).perform()
    actions.click(pointer).perform()
    date_counter += 1

    leagues = driver.find_elements(By.XPATH, './/*[@id="scheduleBottom"]/table[*]')
    print(all_dates[date_counter],'\tdaily leagues:', len(leagues))
    league_counter = 1
    for league in leagues:
        # print("\tleague.text=",league.text,"\n")
        #_rows = Block.find_elements(By.TAG_NAME, "tr")
        league_Title = league.find_element(By.XPATH ,'//*[@id="scheduleBottom"]/table[*]/caption/a')
        #time.sleep(2)
        _rows = league.find_elements(By.XPATH, ".//*[contains(@id, '_mainRow') or contains(@id, '_secondRow')]")
        print("\tleague:", league_Title.text) #, '(', len(_rows), ')')
        row_counter = 1
        for row in _rows:
            #print("\t\trow #",row_counter, row.text.replace('\n', ' | '))  # <- clean text
            if row_counter %2 > 0:
                _time   = row.find_element(By.XPATH, './/*[@id="*_gd"]') 
                _status = row.find_element(By.XPATH, './/*[@id="*_gs"]')
            _team   = row.find_element(By.XPATH, './/*//*[@id="_ta"]')
            _score1 = row.find_element(By.XPATH, './/*[@id="*_rsa1"]')
            _score2 = row.find_element(By.XPATH, './/*[@id="*_rsa2"]')
            _score3 = row.find_element(By.XPATH, './/*[@id="*_rsa3"]')
            _score4 = row.find_element(By.XPATH, './/*[@id="*_rsa4"]')
            _score5 = row.find_element(By.XPATH, './/*[@id="*_rsa5"]')
            _scorea = row.find_element(By.XPATH, './/*[@id="*_ra"]"]')

            # insert to DB
            row_counter += 1
        league_counter += 1
    print('---')

time.sleep(15)
driver.quit()

我收到了错误消息

2022/03/10      daily leagues: 45
        league: NBA
Traceback (most recent call last):
  File "/Users/andy/Python/sa8888 #5.7.py", line 85, in <module>
    _time   = row.find_element(By.XPATH, './/*[@id="*_gd"]') 
  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":".//*[@id="*_gd"]"}
  (Session info: chrome=96.0.4664.110)

我应该怎么做才能修复它? 提前致谢

*@id="*_gd" 和其他 xpath 中的字符串 "*_gd" 中不起作用。

你必须使用 contains() - './/*[contains(@id, "_gd")]'


顺便说一句:

Selenium 可能使用 XPath 1.2 因为它也有 starts-with()
但它没有 ends-with()(存在于 XPath 2.0

堆栈溢出: