You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BeautifulSoup误将SMILES数据中@识别为邮箱,如何获取原始字符串?

解决BeautifulSoup解析SMILES时@符号被误判为邮箱的问题

默认版本的BeautifulSoup本身没有内置邮箱地址识别、混淆替换的逻辑,出现该问题通常是两种场景:站点本身对页面中的邮箱做了服务端混淆替换,或是你使用了带邮箱保护处理的第三方扩展、自定义解析规则。
对应解决方法如下:

  • 第一步:先验证原始请求的HTML内容是否正常
    直接打印网络请求返回的原始HTML文本,检查对应<pre><code>标签内的SMILES中的@符号是否已经被修改。如果原始内容就已经异常,说明是站点的反爬策略导致,和BeautifulSoup无关,可直接抓取站点公开的SMILES数据接口获取原始内容即可。
  • 第二步:调整BeautifulSoup解析配置
    如果原始HTML中的@符号正常,解析后出现异常,可调整解析规则:
    1. 优先使用Python内置的html.parser作为解析器,不要使用带自定义扩展的第三方解析器,示例代码:
    from bs4 import BeautifulSoup
    
    # raw_html为请求拿到的原始HTML字符串
    soup = BeautifulSoup(raw_html, "html.parser")
    smiles_content = soup.select_one("pre code").text
    
    1. 临时占位符替换方案
      如果确实要使用带邮箱处理的解析逻辑,可在解析前对SMILES中的@做临时替换,解析完成后再还原,示例代码:
    import re
    from bs4 import BeautifulSoup
    
    # 预处理:把SMILES中C后面的@替换为临时占位符
    processed_html = re.sub(r"\[C(@+)H\]", lambda match: f"[C{'__TEMP_AT__' * len(match.group(1))}H]", raw_html)
    soup = BeautifulSoup(processed_html, "html.parser")
    raw_smiles = soup.select_one("pre code").text
    # 还原@符号
    final_smiles = raw_smiles.replace("__TEMP_AT__", "@")
    

内容的提问来源于stack exchange,提问作者manchot3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:06:01