如何将bs4.element.Tag转换为JSON?Shein爬取遇解析异常
解决Shein页面script标签JSON解析问题
我来帮你搞定这个问题,你踩的坑其实挺常见的——直接把bs4的Tag对象转成字符串会带上<script>标签的首尾,而且Shein这个script里的内容是JS变量声明,不是纯JSON,所以直接用json.loads肯定会报错。下面一步步给你解决:
问题核心分析
- 你用
str(script)得到的是完整的<script>...</script>标签内容,比如:
这显然不是合法的JSON格式,JSON解析器自然会报错。<script>var goodsInfo = {"id":941649,...};</script> - 另外,这个script里的内容是JS变量赋值语句,需要先剥离变量声明的冗余部分,才能得到可解析的纯JSON字符串。
修正后的完整代码
import json from bs4 import BeautifulSoup import requests url_aux = 'https://www.shein.com/Mock-neck-Brush-Stroke-Print-Bodycon-Dress-p-941649-cat-1727.html?scici=navbar_2~~tab01navbar04~~4~~real_1727~~~~0~~0' response = requests.get(url_aux) soup = BeautifulSoup(response.content, "html.parser") scripts = soup.find_all('script') script = scripts[18] # 第一步:获取script标签内部的纯文本内容,而非整个标签的字符串 script_content = script.string.strip() # 第二步:提取goodsInfo对应的JSON片段 # 假设内容格式是「var goodsInfo = {...};」,剥离变量声明和结尾分号 start_pos = script_content.find('goodsInfo = ') + len('goodsInfo = ') end_pos = script_content.rfind(';') if script_content.endswith(';') else len(script_content) json_raw = script_content[start_pos:end_pos].strip() # 第三步:解析JSON数据 goods_info = json.loads(json_raw) print(goods_info)
额外优化建议
- 避免依赖索引定位script:页面结构可能随时变化,靠第18个script的定位方式不稳定,建议通过内容关键词匹配:
target_script = None for s in soup.find_all('script'): if s.string and 'goodsInfo' in s.string: target_script = s break - 灵活调整提取逻辑:如果打印
script_content后发现格式不同(比如是window.goodsInfo = {...};),只需要把匹配的字符串改成'window.goodsInfo = '即可。
内容的提问来源于stack exchange,提问作者Lucas Damian
相关产品推荐
相关产品推荐

