我試圖讀取名稱類為 shadow-non mb-3 的所有元素并迭代多次以提取 readHeading 和 readCollapse。但是代碼為第一個回傳零,因此回圈不會運行。它也沒有找到 readHeading 和 readCollapse。我嘗試過 xpath 并按名稱搜索。
我的代碼
values="/0"
ga=pandas.read_csv("contracts/adresses.csv")
for i in range (ga.size-1):
fj=ga.iloc[i][0]
# driver.get("https://etherscan.io/address/" str(fj))
break
time.sleep(5)
driver.get("https://etherscan.io/address/" str(fj) "#readContract")
wait = WebDriverWait(driver,30)
frame = wait.until(EC.frame_to_be_available_and_switch_to_it((By.ID,"readcontractiframe")))
expandall = wait.until(EC.element_to_be_clickable((By.XPATH,"//a[@onclick='expandCollapseAll()']")))
expandall.click()
time.sleep(10)
a=[]
va=[]
sik = driver.find_element((By.XPATH,"//*[@id='readContractAccordion']"))
print(sik)
for i in sik:
try:
print(driver.find_element((By.CLASS_NAME, "readHeading" str(i))))
print(driver.find_element(By.CLASS_NAME, "readCollapse" str(i)))
print(i)
except:
print("Elements finished")
break
鏈接
HTML
<div class="card shadow-none mb-3">
<div class="card-header bg-light card-collapse p-0" id="readHeading1">
<a class="btn btn-link btn-block text-dark d-flex justify-content-between align-items-center py-2" data-toggle="collapse" href="#readCollapse1" aria-expanded="true" aria-controls="readCollapse1">
1. name
<span class="accordion-arrow">
<i class="fas fa-arrow-down small"></i>
</span>
</a>
</div><div id="readCollapse1" class="readContractFunction collapse show" aria-labelledby="readHeading1" style="">
<div class="card-body p-3"><form>
<div class="form-group">BNB <i>
<span class="text-monospace text-secondary">string</span></i></div></form></div></div></div>
更新: 錯誤furas
頁面:https : //etherscan.io/token/0xB8c77482e45F1F44dE1745F52C74426C631bDD52#readContract
uj5u.com熱心網友回復:
我發現了一些錯誤和問題:
值在
<iframe>并將Selenium其視為單獨的頁面,它需要driver.switch_to.frame(...)訪問值。你用
By.CLASS_NAME得到readHeading,readHeading但你必須使用By.ID我不明白你想做什么,
sik因為你使用find_element(最后沒有s)來獲取sik所以它只給出一個元素 - 但后來你嘗試將它與for-loop一起使用,并且你希望得到readHeading和 的數字readHeading。我假設所有的標記在頁面上總是有 9 個元素,我使用了for i in range(1, 9):
最少的作業代碼。
它可能需要一些改變 - 即。它可以使用WebDriverWait而不是sleep- 但此時它可以作業。
from selenium import webdriver
#from selenium.webdriver.support.ui import WebDriverWait
#from selenium.webdriver.support import expected_conditions as EC
import time
url = 'https://etherscan.io/token/0xB8c77482e45F1F44dE1745F52C74426C631bDD52#readContract'
#driver = webdriver.Chrome()
driver = webdriver.Firefox()
driver.get(url)
time.sleep(5) # JavaScript needs time to add elements on page
frame = driver.find_element_by_id('readcontractiframe')
driver.switch_to.frame(frame)
driver.find_element_by_xpath('//a[text()="[Expand all]"]').click()
time.sleep(0.5) # JavaScript needs time to expand all
for i in range(1, 9):
print('---', i, '---')
print(driver.find_element_by_id(f"readHeading{i}").text)
print(driver.find_element_by_id(f"readCollapse{i}").text)
結果:
--- 1 ---
1. name
BNB string
--- 2 ---
2. totalSupply
16579517055253348798759097 uint256
--- 3 ---
3. decimals
18 uint8
--- 4 ---
4. balanceOf
<input> (address)
Query
uint256
--- 5 ---
5. owner
0x00c5e04176d95a286fcce0e68c683ca0bfec8454 address
--- 6 ---
6. symbol
BNB string
--- 7 ---
7. freezeOf
<input> (address)
Query
uint256
--- 8 ---
8. allowance
<input> (address)
<input> (address)
Query
uint256
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311625.html
