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

使用Python爬取网站邮箱时正则匹配异常问题求助

问题排查与解决方案

异常原因分析

问题出在get_text()的文本提取逻辑上:它会无差别拼接页面所有节点的文本内容,完全忽略节点结构。在目标页面中,邮箱info@s7health.pl的前后存在隐藏数字节点(如41)和相邻文本节点(如Info),这些内容被拼接成了41info@s7health.plInfo。而你的正则允许邮箱本地部分包含数字,因此会把41info误识别为邮箱前缀,最终匹配出错误结果。

不依赖mailto的解决方法

方法1:给正则添加边界断言

通过正则的前后断言,确保匹配的邮箱前后不是合法的邮箱字符,彻底排除相邻无关内容的干扰:

import re
from bs4 import BeautifulSoup

soup = BeautifulSoup(driver.page_source, "html.parser")
text_email = soup.get_text()
# 反向断言确保邮箱前无单词字符,正向断言确保邮箱后无单词字符
emails1 = re.findall(r'(?<!\w)([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})(?!\w)', str(text_email))

方法2:遍历目标元素提取文本

不直接提取整个页面的文本,而是聚焦于可能包含联系方式的元素(如段落、文本容器),逐个提取文本后再匹配,减少无关内容混入:

import re
from bs4 import BeautifulSoup

soup = BeautifulSoup(driver.page_source, "html.parser")
# 筛选可能含邮箱的元素,可根据页面结构调整标签或类名
target_elements = soup.find_all(['p', 'span', 'div'])
emails1 = []
for elem in target_elements:
    text = elem.get_text(strip=True)
    matches = re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}', text)
    emails1.extend(matches)
# 去重处理
emails1 = list(set(emails1))

方法3:限制邮箱起始字符

强制邮箱本地部分以字母开头,直接排除以数字开头的错误匹配:

emails1 = re.findall(r'([a-zA-Z][a-zA-Z0-9._%+-]*@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})', str(text_email))

内容的提问来源于stack exchange,提问作者Pawel W

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:10:10