You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将bs4.element.Tag转换为JSON?Shein爬取遇解析异常

解决Shein页面script标签JSON解析问题

我来帮你搞定这个问题,你踩的坑其实挺常见的——直接把bs4的Tag对象转成字符串会带上<script>标签的首尾,而且Shein这个script里的内容是JS变量声明,不是纯JSON,所以直接用json.loads肯定会报错。下面一步步给你解决:

问题核心分析

  • 你用str(script)得到的是完整的<script>...</script>标签内容,比如:
    <script>var goodsInfo = {"id":941649,...};</script>
    
    这显然不是合法的JSON格式,JSON解析器自然会报错。
  • 另外,这个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:17:48