【问题标题】:Can't get size of elements and the classes in selenium无法获取元素的大小和硒中的类
【发布时间】: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 和最后的char s 来获取所有元素。稍后您应该使用for i in range(len(sik)): 来获取变量i中的数字
  • 更好的问题(不在评论中)您应该添加指向此页面的链接,以便我们可以在真实页面上测试代码。
  • 您似乎尝试从etherscan.io 抓取数据,但它有API,也许您可​​以在不抓取的情况下获取数据。它应该运行得更快,因为它不需要使用 Selenium。

标签: python selenium selenium-webdriver web-scraping


【解决方案1】:

我发现了一些错误和问题:

  • 值在&lt;iframe&gt; 中,Selenium 将其视为单独的页面,需要driver.switch_to.frame(...) 才能访问值。

  • 您使用By.CLASS_NAME 来获取readHeadingreadHeading,但您必须使用By.ID

  • 我不明白你试图用sik 做什么,因为你使用find_element(最后没有s)得到sik,所以它只给出一个元素 - 但后来你尝试使用它与for-loop 一起使用,您希望得到readHeadingreadHeading 的号码。我假设所有标记在页面上总是有 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

【讨论】:

  • 用我的错误截图更新了问题。
  • 您的代码有效,我正在尝试自动化读取多少值的过程,但 xpath 查找元素会出错。
  • 始终将代码、数据和完整的错误消息作为文本(不是屏幕截图,不是链接)放在有问题的地方(不在评论中)。
  • 可能第一次运行没有尝试/除了看到错误信息——也许会有解释。
  • 我发现了问题。您使用range(1000),所以首先它使用0 并搜索readHeading0,但它不存在。您必须从 1 开始 - 使用 range(1, 1000)。在我的代码中,我还使用 range(1, 9) 而不是 range(9)
猜你喜欢
  • 1970-01-01
  • 2021-06-05
  • 2012-06-13
  • 2021-01-12
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多