Python与Selenium表单提交求助:HVAC网站表单提交失败报错
解决HVAC经销商搜索页面的表单提交问题
错误原因分析
你遇到的TypeError: 'str' object is not callable是因为错误调用了By.CSS_SELECTOR:它是Selenium定义的字符串常量,不是函数,你给它加了括号(By.CSS_SELECTOR('button[data-cy="zipcode-search"]')),相当于把字符串当函数执行,直接触发报错。正确的定位写法是把定位方式和选择器放在一个元组里,用逗号分隔。
另外你代码里还有个隐藏问题:page_source是在表单提交前获取的,拿到的是初始页面的源码,不是搜索后的结果页面,后续用BeautifulSoup解析也得不到有效数据。
修正后的完整代码
# Import required modules from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup import codecs import re driver = webdriver.Firefox() zipcode_input = "35404" target_url = 'https://www.americanstandardair.com/find-your-dealer/' wait = WebDriverWait(driver, 10) driver.get(target_url) wait.until(EC.url_to_be(target_url)) # 等待输入框可交互,输入邮编 zipcode_element = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.ID, 'zipcode')) ) zipcode_element.send_keys(zipcode_input) # 修正定位方式,等待提交按钮可点击并点击 submit_button = WebDriverWait(driver, 20).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-cy="zipcode-search"]')) ) submit_button.click() # 等待搜索结果加载完成(示例:等待结果列表出现) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.dealer-list-item'))) # 提交后再获取页面源码 page_source = driver.page_source soup = BeautifulSoup(page_source, features="html.parser") # 这里可以添加解析经销商数据的逻辑 print("爬取完成") driver.quit()
额外注意事项
- 定位元素时优先用
element_to_be_clickable替代presence_of_element_located,确保元素不仅存在还能交互 - 提交表单后必须等待页面更新(比如等待结果元素出现),再获取源码,否则会拿到旧页面内容
- 如果按钮定位依然失效,可以尝试用XPath定位:
(By.XPATH, '//button[@data-cy="zipcode-search"]')
内容的提问来源于stack exchange,提问作者user25774167
相关产品推荐
相关产品推荐

