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

