如何修复Selenium爬取网页时获取电话号码报Nonetype错误的问题
错误原因&修正方案
你的代码存在3个核心问题导致报错:
- 点击逻辑错误:仅在列表页初始化时获取了1次第一个条目的点击按钮,循环时每次都点击同一个第一个条目,根本没有进入对应治疗师的详情页
- 电话元素定位规则错误:目标站点的电话按钮class为动态生成值,你用的
toggle-phone-number-button已经失效,应该用更稳定的自定义属性定位 - 缺少必要的元素等待:详情页加载未完成就开始定位元素,导致拿到None对象调用text属性报错
修正后完整代码
import json from io import StringIO from bs4 import BeautifulSoup from requests_html import HTMLSession import time from selenium import webdriver import requests import pandas as pd import numpy as np from selenium.webdriver.chrome.options import Options import colorama from colorama import Fore, Back, Style colorama.init(autoreset = False) import selenium from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains PATH = "C:\Program Files (x86)\chromedriver.exe" chrome_options = Options() chrome_options.add_experimental_option('excludeSwitches', ['enable-logging']) driver = webdriver.Chrome(PATH, options = chrome_options) wait = WebDriverWait(driver, 20) # 全局统一显式等待时长,避免重复定义 for b in range(3): url = "https://www.healthgrades.com/usearch?what=Marriage%20%26%20Family%20Therapy&entityCode=PS303&where=CA&pageNum={}&sort.provider=bestmatch&state=CA".format(b+1) driver.get(url) driver.implicitly_wait(10) # 先获取当前页所有治疗师条目数量 length = len(driver.find_elements(By.CSS_SELECTOR, "a[data-qa-target='provider-details-provider-name']")) for j in range(length): # 每次循环重新获取列表元素,避免回退后元素陈旧失效 elements = driver.find_elements(By.XPATH, "//a[@data-qa-target='provider-details-provider-name']") current_name = elements[j].text print(f"治疗师姓名:{current_name}") # 点击当前遍历到的条目进入详情页 elements[j].click() # 等待电话按钮加载可见 try: phone_btn = wait.until(EC.visibility_of_element_located((By.XPATH, "//a[@data-qa-target='provider-phone-button']"))) print(f"联系电话:{phone_btn.text.strip()}\n") except: print("未找到公开的联系电话\n") # 返回列表页 driver.back() # 等待列表页加载完成 wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a[data-qa-target='provider-details-provider-name']")))
关键修改说明
- 调整了点击逻辑:每次循环点击对应索引的治疗师条目,保证进入的是当前遍历对象的详情页
- 更换了电话元素定位规则:使用站点自定义的
data-qa-target属性定位,不受动态class变更影响 - 增加了异常捕获:部分治疗师未公开电话时不会直接中断程序
- 优化了页面等待逻辑:统一使用显式等待替代硬sleep,同时避免了回退后的陈旧元素报错
- 替换了已弃用的
find_element_by_xxx写法,适配新版本Selenium的规范
内容的提问来源于stack exchange,提问作者Adrian Reichert
相关产品推荐
相关产品推荐

