之前的一篇博客,介绍了使用js2xml 模块来解决javascript标签中的数据问题,但实际操作后发现,使用js2xml解析js得到的标签书,太过于反人类了。标签树是得到了,但获取数据就难了很多,那样的标签毕竟不是适合阅读的。
今天又查看了下上篇文章中js的包含的数据结构,不就是dict或者json嘛。顿时感觉发现了新大陆。
既然如此,那就直接开始干了。
首先选定一个目标,我们就直接选择360图片来进行实验,这是链接,打开后,别忘右键查看源代码哦
接下来就是开始直接开始写代码了。
还是万年不变的套路,先导入相关的模块,然后获取页面,标签定位,获取信息
import requests
from bs4 import BeautifulSoup as bs
import json
url = "http://image.so.com/z?ch=wallpaper&t1=156"
r = requests.get(url)
s = bs(r.content,'lxml')
src = s.find(id='initData').text
好了,我们已经获取到想要的信息了,接下来,我们就是直接使用dict或者json操作了吗?
首先,我们来来判断下获取到的数据类型:
print(type(src))
返回的结果是:
<class 'str'>
what? 不是dict的类型,那该怎么获取数据呢?别急,不是导入了json模块吗?json模块下的loads方法,可以直接将类似于'{'name':'eric', 'age': 23}'的数据格式,直接转化为dict。好了,问题已经解决了,那我们 又可以愉快的继续下去了
首先是转换数据格式:
d = json.loads(src)
然后我们再判断下数据类型:
print(type(d))
返回的结果:
<class 'dict'>
可以看到已经成功转换为dict了,接下来就可以按照字典的操作方式获取数据了,先来个小例子,比如获取 "ch" 对应的 “wallpaper”的数据,并打印出来
print(d.get('ch'))
结果如下:
wallpaper
到此,已经成功将js的数据转化为dict格式,也已经能够成功获取到数据了,激不激动?你以为到这里文章就结束了,爱学习的博主怎么可能到这里就罢休了呢?可以将"{}" 这种格式的数据转化为字典的方法就只有json一种吗?No,当然不止这一种,下面将逐一来介绍。
第一种:使用eval(详细介绍)
实例如下:
a = '{"a":"1", "b":"1"}'
b = evel(a)
print(type(b))
>>>
class 'dict'
第二种:转换后赋值给 b(exec详细介绍)
a = '{"a":"1", "b":"1"}'
exec('b='+a)
print(type(b))
>>>
class 'dict'
第3种:先导入json ,--import json(也就是我们现在说的这种方法了)
import json
a = '{"a":"1", "b":"1"}'
c=json.loads(a)
print(type(c))
>>>
class 'dict'
好了,到这里就结束了