BeautifulSoup误将SMILES数据中@识别为邮箱,如何获取原始字符串?
解决BeautifulSoup解析SMILES时@符号被误判为邮箱的问题
默认版本的BeautifulSoup本身没有内置邮箱地址识别、混淆替换的逻辑,出现该问题通常是两种场景:站点本身对页面中的邮箱做了服务端混淆替换,或是你使用了带邮箱保护处理的第三方扩展、自定义解析规则。
对应解决方法如下:
- 第一步:先验证原始请求的HTML内容是否正常
直接打印网络请求返回的原始HTML文本,检查对应<pre><code>标签内的SMILES中的@符号是否已经被修改。如果原始内容就已经异常,说明是站点的反爬策略导致,和BeautifulSoup无关,可直接抓取站点公开的SMILES数据接口获取原始内容即可。 - 第二步:调整BeautifulSoup解析配置
如果原始HTML中的@符号正常,解析后出现异常,可调整解析规则:- 优先使用Python内置的
html.parser作为解析器,不要使用带自定义扩展的第三方解析器,示例代码:
from bs4 import BeautifulSoup # raw_html为请求拿到的原始HTML字符串 soup = BeautifulSoup(raw_html, "html.parser") smiles_content = soup.select_one("pre code").text- 临时占位符替换方案
如果确实要使用带邮箱处理的解析逻辑,可在解析前对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__", "@") - 优先使用Python内置的
内容的提问来源于stack exchange,提问作者manchot3
相关产品推荐
相关产品推荐

