我有一個從 coinmarketcap 上的加密串列中提取名稱的腳本。要獲取名稱,我使用該函式:
num = 0
def print_name():
global num
num = num 1
if num == 100:
exit()
sleep(0.1)
names = driver.find_element(By.XPATH, '/html/body/div[1]/div/div[1]/div[2]/div/div[1]/div[2]/table/tbody/tr[' str(num) ']/td[3]/div/a/div/div/div/p')
print(names.text)
要瀏覽串列,我必須更改 str(num) xpath 中的一個數字,因此 xpath 每次都會移動到串列中的下一個名稱,但在第 18 位,腳本只是隨機停止作業并給出錯誤:
訊息:沒有這樣的元素:無法找到元素:
即使 xpath 保持不變,我也檢查了多次,重繪 了驅動程式,甚至向下滾動以可能加載資料,但程式只是無法識別路徑。
- 不是因為網站阻止了自動化,我嘗試從數字 5 開始,所以在達到數字 18 之前我提出的請求較少,但它仍然沒有作業。
這是錯誤訊息:
Traceback (most recent call last):
File "C:\Users\fkahd\PycharmProjects\coingecko api\sandbox.py", line 27, in <module>
print_name()
File "C:\Users\fkahd\PycharmProjects\coingecko api\sandbox.py", line 23, in print_name
names = driver.find_element(By.XPATH, '/html/body/div[1]/div/div[1]/div[2]/div/div[1]/div[2]/table/tbody/tr[' str(num) ']/td[3]/div/a/div/div/div/p')
File "C:\Users\fkahd\PycharmProjects\coingecko api\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 1244, in find_element
return self.execute(Command.FIND_ELEMENT, {
File "C:\Users\fkahd\PycharmProjects\coingecko api\venv\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute
self.error_handler.check_response(response)
File "C:\Users\fkahd\PycharmProjects\coingecko api\venv\lib\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":"/html/body/div[1]/div/div[1]/div[2]/div/div[1]/div[2]/table/tbody/tr[18]/td[3]/div/a/div/div/p"}
(Session info: chrome=98.0.4758.82)
Stacktrace:
Backtrace:
Ordinal0 [0x00557AC3 2587331]
Ordinal0 [0x004EADD1 2141649]
Ordinal0 [0x003E3BB8 1063864]
Ordinal0 [0x004101CE 1245646]
Ordinal0 [0x004103CB 1246155]
Ordinal0 [0x0043A612 1418770]
Ordinal0 [0x004286D4 1345236]
Ordinal0 [0x00438A0A 1411594]
Ordinal0 [0x004284A6 1344678]
Ordinal0 [0x004053F6 1201142]
Ordinal0 [0x004062E6 1204966]
GetHandleVerifier [0x006FDF22 1680738]
GetHandleVerifier [0x007B0DBC 2413564]
GetHandleVerifier [0x005ED151 563089]
GetHandleVerifier [0x005EBF13 558419]
Ordinal0 [0x004F081E 2164766]
Ordinal0 [0x004F5508 2184456]
Ordinal0 [0x004F5650 2184784]
Ordinal0 [0x004FF5BC 2225596]
BaseThreadInitThunk [0x764AFA29 25]
RtlGetAppContainerNamedObjectPath [0x77BB7A9E 286]
RtlGetAppContainerNamedObjectPath [0x77BB7A6E 238]
它說:無法找到元素:{"method":"xpath","selector":"/html/body/div[1]/div/div[1]/div[2]/div/div[1]/div[2]/table/tbody/tr[18]/td[3]/div/a/div/div/div/p"}
但是,當我去檢查元素時,路徑是
/html/body/div/div/div[1]/div[2]/div/div[1]/div[2]/table/tbody/tr[18]/td[3]/div/a/div/div/div/p
這與錯誤訊息中的完全相同。
文本的HTML:
<p color="text3" font-size="1">SCRT</p>
完整代碼:
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome("C:\Program Files (x86)\chromedriver.exe")
driver.get("https://coinmarketcap.com/view/defi/")
sleep(2)
driver.refresh()
num = 0
num2 = 17
def loop2():
global num2
global names2
num2 = num2 1
if num2 == 100:
exit()
sleep(0.1)
names2 = driver.find_element(By.XPATH, '/html/body/div/div/div[1]/div[2]/div/div[1]/div[2]/table/tbody/tr[' str(num2) ']/td[3]/div/a/div/div/div/p')
def print_name():
global num
num = num 1
if num == 18:
loop2()
sleep(0.1)
names = driver.find_element(By.XPATH, '/html/body/div[1]/div/div[1]/div[2]/div/div[1]/div[2]/table/tbody/tr[' str(num) ']/td[3]/div/a/div/div/div/p')
print(names.text)
while True:
print_name()
這里的快速更新是 xpath 17 和 18 的示例,但 18 不起作用:
/html/body/div/div/div[1]/div[2]/div/div[1]/div[2]/table/tbody/tr[18]/td[3]/div/a/div/div/div/p
/html/body/div/div/div[1]/div[2]/div/div[1]/div[2]/table/tbody/tr[17]/td[3]/div/a/div/div/div/p
感謝您的幫助,祝您有美好的一天。
uj5u.com熱心網友回復:
要在 Coinmarketcap 中按市值從頂級 DeFi 代幣中提取名稱,您必須為visibility_of_all_elements_located()引入WebDriverWait,您可以使用以下任一定位器策略:
使用CSS_SELECTOR:
driver.get("https://coinmarketcap.com/view/defi/") print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "p[class$='coin-item-symbol']")))])使用XPATH:
driver.get("https://coinmarketcap.com/view/defi/") print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//p[contains(@class, 'coin-item-symbol')]")))])注意:您必須添加以下匯入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/425776.html
