【发布时间】:2021-10-05 22:56:32
【问题描述】:
我试图读取名称为 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
The link
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>
更新: Error furas
页面:https://etherscan.io/token/0xB8c77482e45F1F44dE1745F52C74426C631bDD52#readContract
【问题讨论】:
-
shadow-non mb-3不是一个类,而是两个类 - ``shadow-non' 和mb-3- 当有两个或更多类时,Selenium 会出现问题,因为它将它视为单个类并且它在第一堂课之前转换为带有dot的CSS.shadow-non mb-3,但它应该转换为带有两个点且没有空格的.shadow-non.mb-3。 -
你尝试按类名搜索
readHeading1,但它是id,而不是class,你应该使用By.ID -
也许首先使用
print(sik)来看看你得到了什么——find_element只获取第一个元素,你应该使用find_elements和最后的chars来获取所有元素。稍后您应该使用for i in range(len(sik)):来获取变量i中的数字 -
更好的问题(不在评论中)您应该添加指向此页面的链接,以便我们可以在真实页面上测试代码。
-
您似乎尝试从
etherscan.io抓取数据,但它有API,也许您可以在不抓取的情况下获取数据。它应该运行得更快,因为它不需要使用 Selenium。
标签: python selenium selenium-webdriver web-scraping