You need to enable JavaScript to run this app. 如何从BeautifulSoup对象中提取可被json.loads解析的JSON
优惠活动
大模型
产品
解决方案
定价
更多

如何从BeautifulSoup对象中提取可被json.loads解析的JSON

报错原因说明

你代码最后一行调用json.loads时,传入的是BeautifulSoup封装的Tag标签节点对象,而该方法仅支持str、bytes、bytearray类的输入,类型不匹配是触发报错的直接原因。
你之前尝试用.text、.content提取仍出现报错,本质是混淆了两个BS4节点属性的返回结构:

  • .content返回标签内部所有子节点组成的列表,哪怕标签内只有纯文本内容,返回值也是长度为1的列表结构,无法被json.loads识别
  • .text会把标签内所有文本节点拼接为一个完整字符串,只要内容本身是合法JSON,清理掉首尾无意义的空白字符后就可以直接用于解析

正确提取方法

针对当前场景的纯JSON嵌入script标签,按以下流程操作即可正常解析:

  • 定位到目标script标签节点后,调用节点的.text属性获取完整文本内容
  • 用.strip()清理文本首尾的换行、空格等冗余字符
  • 处理后的字符串直接传入json.loads即可得到可操作的Python字典结构

对于仅包含单段纯文本的script标签,也可以直接调用.string属性获取对应字符串,处理效率比.text更高。

修正后的关键代码片段

element = soup.find_all("script",type="application/ld+json")
target_tag = element[2]

# 提取标签内纯JSON文本
raw_json = target_tag.text.strip()
# 解析为Python对象
parsed_json = json.loads(raw_json)

常见注意事项

  • 如果使用.string属性提取文本时返回None,说明标签内存在多个子节点,这种场景下优先用.text属性获取拼接后的完整文本即可
  • 如果提取的文本存在夹杂注释、被其他语法包裹的情况,需要先通过字符串切割去掉非JSON内容后再做解析
  • 你当前定位的是type="application/ld+json"类型的标签,这类标签内部通常是直接嵌入的标准JSON,没有额外语法包裹,按上述方法即可正常完成解析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 16:27:03