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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:19:58