鱼C论坛

 找回密码
 立即注册
查看: 1307|回复: 8

[已解决]请教: 如何解析出Json数据

[复制链接]
发表于 2018-1-19 10:23:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目标URL: http://quotes.toscrape.com/js/
目标内容:网页内容,如:The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”  by Albert Einstein
问题:去除头部字符串后,无法生成合适的Json数据。

  1. import requests
  2. import json
  3. from bs4 import BeautifulSoup
  4. url = "http://quotes.toscrape.com/js/"
  5. r = requests.get(url)
  6. soup = BeautifulSoup(r.text,"lxml")
  7. print(r.status_code)

  8. a = soup.findAll("script")[1].get_text()
  9. b = a[a.find("{"):a.find("];")-1]
  10. print(b)
  11. json_data = json.loads(b)
复制代码


报错信息如下:
  1. 200
  2. Traceback (most recent call last):
  3.   File "F:\01_Python\try.py", line 1878, in <module>
  4.     json_data = json.loads(b)
  5.   File "C:\Python36\lib\json\__init__.py", line 354, in loads
  6.     return _default_decoder.decode(s)
  7.   File "C:\Python36\lib\json\decoder.py", line 342, in decode
  8.     raise JSONDecodeError("Extra data", s, end)
  9. json.decoder.JSONDecodeError: Extra data: line 14 column 6 (char 450)
复制代码


打印b的格式如下,为了简便起见,删除了里面若干行材料:
  1. {
  2.         "tags": [
  3.             "change",
  4.             "deep-thoughts",
  5.             "thinking",
  6.             "world"
  7.         ],
  8.         "author": {
  9.             "name": "Albert Einstein",
  10.             "goodreads_link": "/author/show/9810.Albert_Einstein",
  11.             "slug": "Albert-Einstein"
  12.         },
  13.         "text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d"
  14.     },
  15.     {
  16.         "tags": [
  17.             "abilities",
  18.             "choices"
  19.         ],
  20.         "author": {
  21.             "name": "J.K. Rowling",
  22.             "goodreads_link": "/author/show/1077326.J_K_Rowling",
  23.             "slug": "J-K-Rowling"
  24.         },
  25.         "text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d"
  26.     },
  27.     {
  28.         "tags": [
  29.             "humor",
  30.             "obvious",
  31.             "simile"
  32.         ],
  33.         "author": {
  34.             "name": "Steve Martin",
  35.             "goodreads_link": "/author/show/7103.Steve_Martin",
  36.             "slug": "Steve-Martin"
  37.         },
  38.         "text": "\u201cA day without sunshine is like, you know, night.\u201d"
  39.     }
复制代码


所以现在卡在无法将b转变成合适的json数据,请教各位大神帮帮忙,谢谢!
另外,已经尝试过一些简单的验证,包括验证b的头部和尾部,替代\n和空格,但依然报错。
最佳答案
2018-1-19 10:30:38
本帖最后由 sky 于 2018-1-19 10:36 编辑

数据的格式是字典组成的列表
你的b的字符串是一个大括号包着的许多字典就成了集合set
是没法loads的


  1. b = a[a.find("["):a.find("];")+1]
复制代码

用原本的格式试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-19 10:30:38 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sky 于 2018-1-19 10:36 编辑

数据的格式是字典组成的列表
你的b的字符串是一个大括号包着的许多字典就成了集合set
是没法loads的


  1. b = a[a.find("["):a.find("];")+1]
复制代码

用原本的格式试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-19 11:54:12 | 显示全部楼层
sky 发表于 2018-1-19 10:30
数据的格式是字典组成的列表
你的b的字符串是一个大括号包着的许多字典就成了集合set
是没法loads的


原来的格式指的是直接json_data = json.loads(r.text)吗?
这样子也会直接报错:
  1. json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-19 13:31:19 | 显示全部楼层
payton24 发表于 2018-1-19 11:54
原来的格式指的是直接json_data = json.loads(r.text)吗?
这样子也会直接报错:

我的意思不是 html源码 是var data = 后面的[]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-19 16:21:04 | 显示全部楼层
本帖最后由 payton24 于 2018-1-19 16:22 编辑
sky 发表于 2018-1-19 13:31
我的意思不是 html源码 是var data = 后面的[]


感谢前辈,这样子问题就转变成将对应的字符串转变成字典组成的列表。
我查阅了不少资料,最终使用
  1. b = a[a.find("["):a.find("];")+1]
  2. c = eval[b]     #将字符串转变成列表
复制代码


获取第一个内容时使用:
  1. c[0]['text']
复制代码

结果为:
  1. '“The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.”'
复制代码


结果外层是单引号‘’,然后次外层是双引号“”,再使用:
c[0]['text'][1:-1]

结果为:
  1. 'The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.'
复制代码


总的来说,能完成功能,但是有更加简洁的写法吗?希望能指点一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-19 16:29:19 | 显示全部楼层
payton24 发表于 2018-1-19 16:21
感谢前辈,这样子问题就转变成将对应的字符串转变成字典组成的列表。
我查阅了不少资料,最终使用
  1. data = json.loads(b)
  2. quotes = [i["text"] for i in data]
复制代码

为什么放弃了json呢
eval不要用太危险了
万一里面有import os;os.system("xxxx")你就洗咯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-19 17:19:12 | 显示全部楼层
sky 发表于 2018-1-19 16:29
为什么放弃了json呢
eval不要用太危险了
万一里面有import os;os.system("xxxx")你就洗咯

eval() 函数可编译并执行任何 JavaScript 代码,原来这么危险啊,谢谢了。又学到了不少知识。

又恶补了一下json的基础知识,根据json-python转换表,本例使用json.loads()时,由string→unicode。
所以原string里面的内容是列表格式,就转变成python的列表格式。
如果原string里面的内容是字典格式,对应就会转成python的字典格式。
应该是这样子理解吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-19 17:27:18 | 显示全部楼层
payton24 发表于 2018-1-19 17:19
eval() 函数可编译并执行任何 JavaScript 代码,原来这么危险啊,谢谢了。又学到了不少知识。

又恶补 ...

eval执行字符串形式的python代码不是js代码
其他json.loads是load string的简写 就是把string形式的json数据加载成python数据类型
百度多搜搜就理解了 大体没问题
其实这里我也刚弄明白没多久 字典组成的列表 类似数据库的记录 模拟的就是数据库存数据的格式
如果你了解过可以帮你理解 没有就算了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-19 17:39:34 | 显示全部楼层
sky 发表于 2018-1-19 17:27
eval执行字符串形式的python代码不是js代码
其他json.loads是load string的简写 就是把string ...

谢谢,感觉要学的东西越来越多了,数据库我才刚开始碰。
MongoDB,Mysql,暂时先搞定这两个。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 13:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表