Selenium调用ChromeDriver报错:'str'对象无'capabilities'属性
问题解决:AttributeError: 'str' object has no attribute 'capabilities'
核心错误原因
你使用的是Selenium 4.x版本,但代码沿用了旧版本直接将驱动路径传给webdriver.Chrome()的写法。在Selenium 4中,webdriver.Chrome()的第一个参数是options对象,你传入的路径字符串被误认为是options,导致代码尝试访问字符串的capabilities属性,从而抛出错误。
修复步骤
1. 修正驱动初始化代码
有两种可行方案:
方案一:使用Service类指定驱动路径
导入Service类封装驱动路径:
from selenium import webdriver from selenium.webdriver.chrome.service import Service # 新增导入 START_URL = "https://exoplanets.nasa.gov/discovery/exoplanet-catalog/" # 用Service指定驱动路径 service = Service("C:/Web Drivers/chromedriver") browser = webdriver.Chrome(service=service) browser.get(START_URL) time.sleep(10)
方案二:让Selenium自动管理驱动(推荐)
若你安装的是Selenium 4.6+版本,Selenium Manager会自动下载匹配的浏览器驱动,无需手动指定路径:
from selenium import webdriver START_URL = "https://exoplanets.nasa.gov/discovery/exoplanet-catalog/" browser = webdriver.Chrome() # 无需传路径,自动管理 browser.get(START_URL) time.sleep(10)
2. 修复代码中的其他问题
除核心错误外,代码还有几处需修正:
- BeautifulSoup解析器拼写错误:
"html_parser"改为"html.parser"(点号而非下划线) - 行星名称提取语法错误:
soup.find_all("a"[0].contents[0])改为soup.find_all("a")[0].contents[0](修正括号位置) - 下一页定位过于绝对,改用更稳定的方式:
browser.find_element(By.XPATH, "//button[contains(@class, 'pagination__next')]").click()
修正后的完整代码示例
from selenium import webdriver from selenium.webdriver.chrome.service import Service from bs4 import BeautifulSoup import time import csv from selenium.webdriver.common.by import By START_URL = "https://exoplanets.nasa.gov/discovery/exoplanet-catalog/" service = Service("C:/Web Drivers/chromedriver") browser = webdriver.Chrome(service=service) browser.get(START_URL) time.sleep(10) def scrape(): headers = ["name","light_years_from_earth","planet_mass","stellar_magnitude","discovery_data"] planet_data = [] for i in range(0,428): soup = BeautifulSoup(browser.page_source,"html.parser") for ul_tag in soup.find_all("ul", attrs={"class": "exoplanet"}): li_tags = ul_tag.find_all("li") temp_list = [] for index, li_tag in enumerate(li_tags): if index == 0: temp_list.append(li_tag.find("a").contents[0]) else: try: temp_list.append(li_tag.contents[0]) except: temp_list.append("") planet_data.append(temp_list) try: browser.find_element(By.XPATH, "//button[contains(@class, 'pagination__next')]").click() time.sleep(2) except: break with open("scrapper_2.csv","w", newline="", encoding="utf-8") as f: csvwriter = csv.writer(f) csvwriter.writerow(headers) csvwriter.writerows(planet_data) scrape() browser.quit()
内容的提问来源于stack exchange,提问作者rafay khan
相关产品推荐
相关产品推荐

