使用re.compile结合BeautifulSoup定位span元素返回None的解决方法
解决方法及排查步骤
1. 先确保页面完成动态加载
返回None最常见的原因是Selenium获取页面源码时,目标span还没被JavaScript渲染出来。必须先等待页面加载完成:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待目标span所在区域加载完成(可替换为更精确的选择器,比如父元素ID) WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "span")) ) # 再获取完整的页面源码 page_source = driver.page_source
2. 修正正则匹配规则
如果span文本不是精确的Adresse,而是带空格、标点或大小写变化,要调整正则表达式:
- 匹配包含
Adresse的任意文本(忽略大小写):re.compile(r'.*Adresse.*', re.IGNORECASE) - 仅匹配以
Adresse开头的文本:re.compile(r'^Adresse') - 匹配带冒号的场景(比如
Adresse:):re.compile(r'Adresse:*')
3. 正确结合BeautifulSoup使用
场景1:span为纯文本(无嵌套子标签)
直接用text参数配合正则查找:
import re from bs4 import BeautifulSoup soup = BeautifulSoup(page_source, 'html.parser') target_span = soup.find('span', text=re.compile(r'.*Adresse.*', re.IGNORECASE))
场景2:span内嵌套其他标签(比如<span><b>Adresse</b>: 123 Main St</span>)
此时tag.string会返回None,需要通过get_text()获取完整文本后判断:
target_span = soup.find('span', lambda tag: 'Adresse' in tag.get_text(strip=True))
4. 排查验证步骤
- 打印
page_source并搜索Adresse,确认源码中确实存在目标span - 如果源码有但BeautifulSoup找不到,尝试更换解析器(比如用
lxml代替html.parser) - 用Selenium直接定位元素验证:
driver.find_element(By.XPATH, "//span[contains(text(), 'Adresse')]"),确认元素是否可被定位
内容的提问来源于stack exchange,提问作者Rapid1898
相关产品推荐
相关产品推荐

