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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:27:04