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

使用BeautifulSoup与Selenium提取网页传真号码返回None的技术求助

问题排查与修复方案

我帮你排查了代码里的几个关键问题,咱们一步步来修正,解决无法获取传真号码的问题:

1. 正则表达式匹配逻辑错误

你原有的正则'Fax ([\\\\d\\\\s]*)'没有考虑网页中传真号码的实际格式(比如页面里是Fax : 03 20 XX XX XX,带冒号和空格),而且双反斜杠的写法可以简化。建议改用原始字符串编写正则,匹配更贴合实际的格式:

# 预编译正则,匹配"Fax"后跟任意空格+冒号+任意空格,再提取数字和空格组成的号码
fax_pattern = re.compile(r'Fax\s*:\s*([\d\s]+)')

2. 元素定位不可靠

原代码里的'.address+ .contact p' CSS选择器不是所有页面都适用,容易因为页面结构差异导致找不到元素。建议先判断目标元素是否存在,再提取文本:

contact_p = soup.select_one('.contact p')
if contact_p:
    text = contact_p.text.strip()
    match = fax_pattern.search(text)
    Fax = match.group(1).strip() if match else None
else:
    Fax = None

3. 页面加载不充分导致元素缺失

切换到律师详情页后,直接解析HTML可能因为页面还没加载完成,导致目标元素还未渲染。建议用Selenium的显式等待替代固定sleep,更高效且可靠:

# 需要提前导入这些模块
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 在跳转详情页后添加等待逻辑
driver.get(link)
# 等待最多5秒,直到.contact元素加载完成
WebDriverWait(driver, 5).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, '.contact'))
)
soup = BeautifulSoup(driver.page_source, "html.parser")

4. ChromeDriver路径与版本兼容问题

你手动指定的ChromeDriver路径容易因为版本不匹配、路径写错出问题,建议用你已经导入的webdriver_manager自动管理驱动,避免版本兼容问题:

# 替换原有的driver初始化代码
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

5. 异常处理过于宽泛

原代码的except:会捕获所有异常,不利于排查具体问题(比如元素找不到、正则匹配失败等)。建议只捕获特定异常,或者保留错误日志方便调试:

try:
    # 页面加载和提取逻辑...
except Exception as e:
    print(f"处理链接{link}时出错: {str(e)}")
    Fax = None

完整修正后的代码示例

import requests
import re
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

headers ={
 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}
base_url='https://www.avocats-lille.com/'
url = 'https://www.avocats-lille.com/fr/annuaire/avocats-du-tableau-au-barreau-de-lille?view=entries'

# 自动管理ChromeDriver,避免版本兼容问题
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get(url)

soup = BeautifulSoup(driver.page_source, "html.parser")
tra = soup.find_all('h2',class_='title')
productlinks=[]
for links in tra:
    for link in links.find_all('a',href=True):
        # *注意*:有些href已经是完整链接,不需要拼接base_url
        comp = link['href'] if link['href'].startswith('http') else base_url + link['href']
        productlinks.append(comp)

# 预编译正则表达式,提升匹配效率
fax_pattern = re.compile(r'Fax\s*:\s*([\d\s]+)')

for link in productlinks:
    try:
        driver.get(link)
        # 显式等待.contact元素加载完成
        WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '.contact'))
        )
        soup = BeautifulSoup(driver.page_source, "html.parser")
        contact_p = soup.select_one('.contact p')
        
        if contact_p:
            text = contact_p.text.strip()
            match = fax_pattern.search(text)
            Fax = match.group(1).strip() if match else None
        else:
            Fax = None
        
        print(f"链接: {link}, 传真号码: {Fax}")
    except Exception as e:
        print(f"处理链接{link}时发生错误: {str(e)}")
        Fax = None

# 记得关闭浏览器
driver.quit()

内容的提问来源于stack exchange,提问作者Amen Aziz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:14:09