使用Python Selenium爬取SmartyStreets站点的Carrier Route地址字段
解决方案
核心问题原因
你遇到的定位失败主要有两个常见原因:
- 页面的地址查询演示模块是内嵌在iframe中的,没有切换iframe上下文的话直接定位元素会返回找不到的错误
- 没有设置等待逻辑,提交查询后页面还未完成结果渲染就执行定位操作
具体实现步骤
- 引入显式等待相关依赖,避免强制等待的不稳定性
- 打开目标页后先定位到演示模块的iframe,切换上下文后再执行查询操作
- 提交地址查询后等待结果区域渲染完成,用关联文本的XPath定位Carrier Route对应值
完整可运行代码
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 初始化驱动 driver = webdriver.Chrome('chromedriver') wait = WebDriverWait(driver, 10) # 最长等待10秒,可根据网络情况调整 address = "3301 South Greenfield Rd Gilbert, AZ 85297" url = 'https://www.smartystreets.com/products/single-address-iframe' try: driver.get(url) # 切换到演示模块的iframe demo_iframe = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'iframe[src*="demo/iframe"]'))) driver.switch_to.frame(demo_iframe) # 选择自由格式输入 wait.until(EC.element_to_be_clickable((By.ID, "lookup-select-button"))).click() wait.until(EC.element_to_be_clickable((By.ID, "address-freeform"))).click() # 输入地址并提交查询 input_ele = wait.until(EC.visibility_of_element_located((By.ID, "freeform-address"))) input_ele.send_keys(address) wait.until(EC.element_to_be_clickable((By.ID, "lookup-button"))).click() # 定位Carrier Route字段值 carrier_route_ele = wait.until(EC.visibility_of_element_located( (By.XPATH, "//dt[normalize-space(text())='Carrier Route']/following-sibling::dd[1]") )) carrier_route = carrier_route_ele.text.strip() print(f"Carrier Route结果:{carrier_route}") finally: driver.quit()
注意事项
- 可根据实际网络环境调整显式等待的最长时长,避免网络延迟时加载超时
- 不要高频发起请求,避免触发站点的反爬机制
- 可新增异常捕获逻辑处理无效地址、无返回结果的边缘情况
内容的提问来源于stack exchange,提问作者swp1
相关产品推荐
相关产品推荐

