• python淘宝商品数据抓取之后数据解析出错怎么办


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 *erua* 2024-06-08 22:55 采纳率: 0% 浏览 5 首页/ 编程语言 / python淘宝商品数据抓取之后数据解析出错怎么办 pythonjson爬虫 跟着b站上面的视频写的爬虫抓取淘宝商品数据的代码,但总是在处理抓到的数据时出错,请大家帮忙看看应该怎么改 from DrissionPage import ChromiumPage import re import json #打开浏览器 driver=ChromiumPage() #访问淘宝网站 driver.get('https://www.taobao.com/') #监听数据包(调用API URL,以返回结构化的数据json等) driver.listen.start('h5/mtop.relationrecommend') #定位网页中的搜索框并输入商品关键字 driver.ele('css:#q').input('捏捏') #点击搜索按钮进入搜索 driver.ele('css:.btn-search').click() #设置延时 driver.wait(2) #下滑以获取当页的完整数据 driver.scroll.to_bottom() #等待数据包加载 resp=driver.listen.wait() #获取响应数据 text=resp.response.body #解析数据,提取内容 info=re.findall(r'mtopjsonp\d+\((.*)',text) json_data=json.loads(info) #根据键值对取值,提取商品所在信息列表 items=json_data['data']['itemsArray'] print(text) print(info) print(items) print(items)报错如图: 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    1条回答 默认 最新

    • 阿里嘎多学长 2024-06-08 23:02
      关注

      以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


      根据您提供的错误信息和代码,问题出现在以下这行:

      json_data=json.loads(info)
      

      错误提示 TypeError: the JSON object must be str, bytes or bytearray, not list 表示 json.loads() 函数接收到的参数 info 是一个列表(list),而不是期望的字符串(str)、字节(bytes)或字节数组(bytearray)。

      问题的原因可能是 re.findall() 函数返回了一个包含多个匹配项的列表,而 json.loads() 需要的是列表中的单个字符串。从错误信息中可以看到 info 变量应该是包含多个匹配项的列表,而不是单个JSON字符串。

      要解决这个问题,您需要确保 re.findall() 只返回一个匹配项,或者从返回的列表中选择正确的字符串进行解析。下面是一些可能的解决方案:

      1. 检查正则表达式:确保 re.findall() 正则表达式正确匹配了您想要的JSON字符串。如果 mtopjsonp 函数调用是唯一的,您可能需要调整正则表达式以确保只匹配到一个结果。

      2. 选择正确的字符串:如果 re.findall() 返回了多个结果,您需要确定哪一个是有效的JSON字符串。这可能需要您根据返回的数据结构手动选择或编写逻辑来确定正确的字符串。

      3. 调试输出:在调用 json.loads() 之前,打印 info 列表的内容,检查它包含的元素,以确定哪个是正确的JSON字符串。

      4. 异常处理:使用 try-except 语句来捕获 json.loads() 可能抛出的异常,并提供错误处理逻辑。

      下面是修改后的代码示例,包括了异常处理和选择列表中的第一个元素作为JSON字符串的逻辑:

      # ... 省略其他代码 ...
      
      # 解析数据,提取内容
      info = re.findall(r'mtopjsonp\d+\((.*)\)', text)  # 注意正则表达式可能需要调整
      if info:  # 确保info不为空
          json_str = info[0]  # 选择列表中的第一个元素作为JSON字符串
          try:
              json_data = json.loads(json_str)
              # 根据键值对取值,提取商品所在信息列表
              items = json_data['data']['itemsArray']
              print(items)
          except json.JSONDecodeError as e:
              print(f"JSON 解析错误: {e}")
      else:
          print("没有找到匹配的JSON字符串")
      

      请注意,您可能需要根据实际的JSON数据结构调整键路径(例如 'data''itemsArray')。

      至于参考资料,您可以查看 Python 官方文档中的 json 模块 来了解更多关于 json.loads() 函数的信息,以及 re 模块 来了解正则表达式的使用。此外,对于爬虫相关的知识,可以查看 Scrapy 框架的 官方文档,它是一个强大的爬虫框架,提供了许多高级功能。

      展开全部

      评论 编辑记录
      编辑
      预览

      报告相同问题?

    • 相关阅读:
      测试工程师思维学习
      Visual Studio Code的下载和安装
      切割后面积最大的蛋糕
      Linux C 线程间同步机制
      低价链接,平台投诉,你真的会吗
      Android WebView使用总结
      浅学一下二叉树链式存储结构的遍历
      从零开始应用LSTM网络
      Angular知识整合一:Angular中的组件和一些基本概念
      有中断下半部tasklet处理的按键驱动
    • 原文地址:https://ask.csdn.net/questions/8115969