You need to enable JavaScript to run this app. Python BeautifulSoup按优先级提取邮箱、decompose清理空标签实现
优惠活动
大模型
产品
解决方案
定价
更多

Python BeautifulSoup按优先级提取邮箱、decompose清理空标签实现

邮箱提取功能实现方案

现有代码问题说明

  • 你当前每遍历一个UserInfo类标签就执行一次匹配并打印结果,哪怕没匹配到邮箱也会输出空列表[],所以才会出现多行空列表的输出。
  • 没有实现优先级搜索逻辑:现在是遍历所有同类标签,而不是「先搜第一指定类、没找到再搜第二指定类」的规则。
  • 额外加了没用的标签删除逻辑:你的需求是提取邮箱,不需要修改原HTML结构,这段decompose的代码完全不影响提取结果还增加冗余操作。

修正后符合需求的代码

核心逻辑规则

  • 第一优先级:先搜索类为Profile-line的元素(对应示例HTML里的Search Location No.1位置)
  • 第二优先级:如果第一优先级没找到邮箱,再搜索类为UserInfo的元素(对应示例HTML里的Search Location No.2位置)
  • 两个位置都没匹配到邮箱,最终结果直接设为N/A,全程只输出一次最终结果,不会出现多行空列表。

完整可运行代码

import re
from bs4 import BeautifulSoup

# 提前定义邮箱匹配正则,避免循环里重复定义
EMAIL_REGEX = r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+"
final_email = "N/A"  # 先默认赋值为N/A,找到再覆盖

# 1. 先搜第一优先级元素
first_target = soup.find(class_="Profile-line")
if first_target:
    # 提取元素文本并匹配邮箱
    matched_emails = re.findall(EMAIL_REGEX, first_target.text.strip())
    if matched_emails:
        final_email = matched_emails[0]  # 取第一个匹配到的邮箱,需要全量的话可以直接存列表

# 2. 如果第一优先级没找到,再搜第二优先级
if final_email == "N/A":
    second_target = soup.find(class_="UserInfo")
    if second_target:
        matched_emails = re.findall(EMAIL_REGEX, second_target.text.strip())
        if matched_emails:
            final_email = matched_emails[0]

# 只输出一次最终结果
print(final_email)

代码调整说明

  • 去掉了循环内的打印逻辑,只在所有搜索完成后输出一次结果,彻底解决多行空列表的问题。
  • 只要在高优先级元素里找到邮箱就直接结束搜索,不会再遍历低优先级元素,符合优先级要求。
  • 删除了没用的decompose标签删除逻辑,减少冗余操作。
  • 如果你要调整搜索的优先级类名,只需要修改代码里两处class_后面的类名即可。

内容的提问来源于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.26 13:27:03