Python+BeautifulSoup用re.search按优先级搜索邮箱的实现
原有代码存在的问题
- 未对
soup.find()的结果做判空,当页面上不存在对应class的UserBio/UserInfo区块时,直接调用.text属性就会触发AttributeError: 'NoneType' object has no attribute 'text' - 两个独立的try-except块没有优先级判断逻辑:哪怕Bio区块已经成功匹配到邮箱,代码仍会继续执行Info区块的搜索,最终的
email变量会被后一次的结果覆盖,完全不符合“优先搜Bio”的需求 - 没有全局兜底的默认值赋值,当两个区块都匹配不到邮箱时,
email变量会保留异常状态的值,无法按要求返回“N/A”
修正后的可运行代码
import re import requests from bs4 import BeautifulSoup email_list = [] url = input("Link") r = requests.get(url, timeout=30) soup = BeautifulSoup(r.text, 'html.parser') # 原代码中未被使用的h1查找逻辑可按实际需求保留 # name_array = soup.find_all('h1', {'class': 'class1'}) # 先对DOM查找结果做判空,避免None取属性报错 bio_node = soup.find('div', {'class': 'UserBio'}) info_node = soup.find('div', {'class': 'UserInfo'}) bio_content = bio_node.text if bio_node else "" info_content = info_node.text if info_node else "" # 初始化默认值 extracted_email = "N/A" # 优先匹配Bio区块的邮箱 bio_match = re.search(r'\S+@\S+', bio_content) if bio_match: extracted_email = bio_match.group() else: # Bio未匹配到,再搜索Info区块 info_match = re.search(r'\S+@\S+', info_content) if info_match: extracted_email = info_match.group() email_list.append(extracted_email) print(extracted_email)
补充优化点:如果需要减少邮箱匹配的误判,可以把正则从宽泛的
\S+@\S+替换为更规范的邮箱格式匹配规则,能避免把文本中挨着@符号的无意义字符串识别为邮箱;全程不需要写冗余的try-except结构,只要提前对可能为None的DOM节点做判空,就能从根源上规避属性调用的报错。
内容的提问来源于stack exchange,提问作者A_K
相关产品推荐
相关产品推荐

