使用BeautifulSoup爬取邮箱时无法提取纯文本邮箱的求助
问题原因
原脚本无法提取纯文本邮箱的核心问题有3个:
re.match()规则是从字符串首字符开始完全匹配,如果邮箱不是单独占一个标签的全部文本(比如标签内还有其他说明文字),就算包含邮箱也会匹配失败- 遍历所有标签逐一提取文本的逻辑会遗漏嵌套在普通文本片段里的邮箱,同时也会因为父子标签重复遍历导致重复匹配
- 特殊字符(空格、换行、制表符)的清理步骤放在了匹配之后,没有提前处理文本里的干扰字符
解决思路
直接提取整个页面的纯文本内容,用re.findall()全局搜索所有符合邮箱规则的字符串,再做去重和清洗即可,不需要遍历单个DOM标签。
修正后可运行代码
import requests import re from bs4 import BeautifulSoup mails = [] url = 'https://sourceforge.net/projects/peruggia/' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') # 直接提取整个页面的纯文本,提前清理干扰字符 page_text = soup.get_text().replace(" ", "").replace('\r', '').replace('\n', '').replace('\t', '') # 全局搜索所有符合规则的邮箱 email_pattern = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+' found_mails = re.findall(email_pattern, page_text) # 去重 mails = list(set(found_mails)) if len(mails) == 0: print("NO MAILS FOUND") else: for mail in mails: print(mail)
运行上述代码即可成功提取到目标邮箱 cyberfiles.hacker@gmail.com。
内容的提问来源于stack exchange,提问作者John Warwick
相关产品推荐
相关产品推荐

