首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Selenium无法找到网页上的元素

Selenium无法找到网页上的元素
EN

Stack Overflow用户
提问于 2022-04-26 12:26:05
回答 1查看 74关注 0票数 0

代码的一部分工作:我进入美国地质勘探局网站,并进入最新的地震网页。现在我要做的是下载最新地震的csv文件。下载按钮位于页面末尾,当我运行脚本时,它返回selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element。任何如何解决这个问题的想法都是受欢迎的。提前感谢

代码语言:javascript
运行
复制
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service

ser = Service('C:\\chromedriver.exe')
opt = webdriver.ChromeOptions()

web = webdriver.Chrome(service=ser, options=opt)
web.get('https://www.usgs.gov/')

web.find_element(by=By.CSS_SELECTOR, value= '#block-tools > div > p > a:nth-child(1)').click()
web.maximize_window()

web.find_element(by=By.CSS_SELECTOR, value= 'body > usgs-root > div > usgs-list > cdk-virtual-scroll-viewport > div.cdk-virtual-scroll-content-wrapper > usgs-download-button > div > button > span.mat-button-wrapper').click()

downloadCsv = web.find_element(by=By.CSS_SELECTOR, value='#mat-dialog-1 > usgs-download-options > div.mat-dialog-content > ul > li:nth-child(2) > a')
downloadCsv.click()
EN

Stack Overflow用户

回答已采纳

发布于 2022-04-26 12:29:41

您需要等待元素加载,使用显式等待,或者可以添加隐式等待web.implicitly_wait(10),您可以使用sleep(10)来测试是否存在问题。

请参阅https://selenium-python.readthedocs.io/waits.html'

另外,您还需要切换到新的选项卡。

代码语言:javascript
运行
复制
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# used this lib to update my chrome driver automatically
from webdriver_manager.chrome import ChromeDriverManager

opt = webdriver.ChromeOptions()

web = webdriver.Chrome(ChromeDriverManager().install(), options=opt)
web.get('https://www.usgs.gov/')


try:
    web.maximize_window()
    element = WebDriverWait(web, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '#block-tools > div > p > a:nth-child(1)'))
    )
    element.click()

    # after click you need to switch to the new tab
    web.switch_to.window(web.window_handles[1])

    element = WebDriverWait(web, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'body > usgs-root > div > usgs-list > cdk-virtual-scroll-viewport > div.cdk-virtual-scroll-content-wrapper > usgs-download-button > div > button > span.mat-button-wrapper'))
    )
    element.click()

    # your css selector did not work so I changed it

    element = WebDriverWait(web, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'usgs-download-options > div.mat-dialog-content > ul > li:nth-child(2) > a'))
    )
    element.click()
finally:
    web.quit()

如果你的整个硒就是为了这个目的,我想你可以用一个更简单、更快的脚本直接下载CSV,就像CSV作为直接下载链接,除了我遗漏了一些东西之外。

代码语言:javascript
运行
复制
import csv
import requests

CSV_URL = 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.csv'

with requests.Session() as s:
    download = s.get(CSV_URL)

    decoded_content = download.content.decode('utf-8')

    cr = csv.reader(decoded_content.splitlines(), delimiter=',')
    my_list = list(cr)
    for row in my_list:
        print(row)

#             or write to file
    local_filename = CSV_URL.split('/')[-1]

    with open(local_filename, 'wb') as f:
        for chunk in download.iter_content(chunk_size=8192):
            # If you have chunk encoded response uncomment if
            # and set chunk_size parameter to None.
            # if chunk:
            f.write(chunk)
票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72013943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档