如何从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
相关产品推荐
相关产品推荐

