使用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
相关产品推荐
相关产品推荐

