You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:47:25