如何提取bs4.element.Tag类型script标签内容并转换为指定结构JSON文件
问题原因
报错的核心原因是你直接将BeautifulSoup返回的script标签对象整体转为字符串,得到的结果包含<script>标签外壳,并非纯JSON内容,所以json.loads无法解析。
解决方法
- 提取
script标签内部的纯文本内容,调用BeautifulSoup标签对象的.text属性即可获取标签包裹的原始JSON字符串。 - 对纯JSON字符串执行
json.loads解析,即可得到Python字典结构,后续可以直接处理或者导出为JSON文件。
修正后的完整代码
import requests from bs4 import BeautifulSoup as BS import json url = 'https://www.economist.com/' # 增加请求头避免被反爬拦截 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } r = requests.get(url, headers=headers) r.encoding = r.apparent_encoding # 自动匹配页面编码,避免乱码问题 soup = BS(r.content,'html.parser') data_tag = soup.find('script', attrs={'type':'application/ld+json'}) # 判空逻辑避免标签不存在时报错 if data_tag: json_str = data_tag.text.strip() # 取出文本并去除首尾空白字符 json_data = json.loads(json_str) print(json_data) # 如果需要保存为本地JSON文件,添加以下代码 with open('economist_ld.json', 'w', encoding='utf-8') as f: json.dump(json_data, f, ensure_ascii=False, indent=2) else: print("未找到符合条件的script标签")
额外说明
- 部分网站的
application/ld+json内容可能存在转义字符,.text属性会自动处理HTML转义,不需要额外手动处理。 - 增加请求头和判空逻辑可以大幅提升代码兼容性,应对反爬拦截、页面结构变动等异常场景。
内容的提问来源于stack exchange,提问作者mira.162
相关产品推荐
相关产品推荐

