You need to enable JavaScript to run this app. Python+BeautifulSoup用re.search按优先级搜索邮箱的实现
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 04:57:03