关于Python json解析过程遇到的问题:(爬取天气json数据所遇到的问题http://tianqi.2345.com/)

part.1

url——http://tianqi.2345.com/t/wea_history/js/201708/60061_201708.js

返回的数据如下:

这就尴尬了,直接json.loads是返回错误的。

对比了其他网页返回的——http://www.toutiao.com/search_content/?offset=0&format=json&keyword=%E8%A1%97%E6%8B%8D&autoload=true&count=20&cur_tab=1

是不是格式问题:多了var……

于是乎谷歌解决办法:

1、将所有‘变成” 2、添加“”(因为字典的键格式不标准,比如ymd没有双引号的)3、json前处理好数据 比如截断var weather_str={city:'新河',tqInfo:这部分

url = 'http://tianqi.2345.com/t/wea_history/js/201708/60061_201708.js'
r = requests.get(url).text
s=r.split("tqInfo:")[1]
s=s.split(",maxWendu")[0]
s=s.replace("'",'"') s =re.sub(r'[a-zA-Z]+',lambda x:'"'+x.group(0)+'"',s)
print s data = json.loads(s)
for i in data:
print i['aqi']

ok,经过数据清洗处理,勉强能用。

但是好奇怪,为什么返回的json数据是这样的?比较大型的网页也这样马虎?难道是为了反爬虫的设置?  带着这些问题,我们进入下一个环节

--------------------------------------------------

part.2——selenium+phantomjs模拟爬取

from selenium import webdriver
driver = webdriver.PhantomJS()
#executable_path为你的phantomjs可执行文件路径
driver.get("http://tianqi.2345.com/wea_history/60061.htm") #或得js变量的值
r = driver.execute_script("return weather_str")
print r

得到的结果:

注意:

返回的结果跟用requests返回的不一致,少了var weather_str…… 免除数据清洗的烦恼。

回到part1最后的疑问,也就是说不是网页设计问题,其实是自己境界未到,还不知道这样的处理方法。原来是这样处理的,自己还是太肤浅了。

推测:应该有反爬虫设置,返回json数据经过浏览器加载能正确呈现数据,直接requests得到数据不规整,限制获取

很接近了,但是用json.loads还是返回错误TypeError: expected string or  buffer

奇怪了  奇怪了  奇怪了,为什么这样?返回类型很标准了啊,正常可以解析啦

 
 

解决办法:——谷歌+try尝试输出。

for i in data:
print i

这玩意直接就是字典啊,输出的都是字典键,然后详细信息都在tqInfo里面啊。

经过这样处理,爬取的信息可以拿出来并且使用了,但是为什么不用json呢?明明返回的是json数据啊

-------------------------------------------------------------

part.3——TypeError: expected string or buffer  ——使用dumps和loads解决

百思不得其解。经过调试,最终发现,python中默认使用单引号表示字符串"'"
所以当,用字符串符值以后,python会把双引号转换为单引号,但是json不支持单引号。
也就是说:
先dumps转换,再loads转换,最终得出我们想要的结果,一步到位。
from selenium import webdriver
driver = webdriver.PhantomJS()
#executable_path为你的phantomjs可执行文件路径
driver.get("http://tianqi.2345.com/wea_history/60061.htm") #或得js变量的值
r = driver.execute_script("return weather_str") json_str = json.dumps(r) python_obj = json.loads(json_str)
print python_obj
for i in python_obj:
print i

一波三折,终于把这个问题解决了。

关于Python json解析过程遇到的TypeError: expected string or buffer的更多相关文章

  1. 导入json文件报错,TypeError expected string or buffer

    导入json文件报错,TypeError expected string or buffer 原因:用字符串赋值后,python会把双引号转换为单引号 import json data = [{&qu ...

  2. 解决:error: Cannot fetch repo (TypeError: expected string or buffer)

    同步源码,问题重现: Fetching project platform/external/libopus Fetching project repo error: Cannot fetch repo ...

  3. TypeError: expected string or buffer的解决方法

    错误种类:TypeError: expected string or buffer 具体错误解释:这是因为返回的变量不是字符类型,而导致此错误 具体解决方法:在具体程序段前加if判断语句,判断程序返回 ...

  4. a=re.findall('b',c)报错提示:TypeError:expected string or buffer

    目的:想通过findall选取某个unicode编码的字符串列表(列表里面有元组) 问题:报错[TypeError:expected string or buffer] 现在测试下: 定义一个有元组的 ...

  5. 解决:return _compile(pattern, flags).search(string) TypeError: expected string or buffer

    今天写爬虫,爬取MM图片页面的标题时,遇到了一个问题,上图: 看看我的代码: import urllib import urllib2 import re class JPMSG: def __ini ...

  6. [Python]json对象转换出错expected string or buffer python

    [问题] 今天在使用python中的json转换碰到一个问题: 错误显示: expected string or buffer json内容如下: {u'err_no': 0, u'corpus_no ...

  7. 在Json解析过程中,我为什么用object1.optInt ,和 object1.optString

    今天在做Json解析的时候,出现了一段代码没执行的问题,于是找了一下原因: 1.原代码是:   发现 红色的一句 没有执行,查看控制台发现了异常 2.修复bug ,正确的代码为        3.总结 ...

  8. Python json解析

    #encoding: utf-8 ''' Author:Siukwan ''' import sys reload(sys) sys.setdefaultencoding('utf8') import ...

  9. python json 解析

    Encode过程,是把python对象转换成json对象的一个过程,常用的两个函数是dumps和dump函数. dic1 = {'type':'dic1','username':'loleina',' ...

随机推荐

  1. poj 3616 Milking Time (基础dp)

    题目链接 http://poj.org/problem?id=3616 题意:在一个农场里,在长度为N个时间可以挤奶,但只能挤M次,且每挤一次就要休息t分钟: 接下来给m组数据表示挤奶的时间与奶量求最 ...

  2. Hangman Judge UVA - 489

    In ``Hangman Judge,'' you are to write a program that judges a series of Hangman games. For each gam ...

  3. 题解 yzoj1663: 愤怒的牛(二分) yzoj1662: 曲线(三分)

    话说二分和三分的题还没有整理过,就趁这两题来整理下笔记 先讲讲关于二分,对于二分的具体边界长期以来对我来说都是个玄学问题,都是边调边拍改对的.思路大体是确定左边界l,和有边界r,判断满足条件缩小范围. ...

  4. webapi 参数传递详解

    原因 经常有朋友遇到webapi参数传递问题,自己也碰到过一些坑,在此记录下正确的姿势,简单参数传递相信没有人会有问题,容易出现问题的是对象参数和表单参数. 1.WebApi5.2.3有FromBod ...

  5. Springboot2.x 自动创建表并且执行初始化数据

    1.使用springboot jdbc初始化数据库 项目结构 schema.sql drop table if exists user; create table user (id bigint(20 ...

  6. Linux运维基础提高之RAID卡和磁盘分区

    磁盘大小计算: 柱面的数量*每个柱面的大小(容量) [root@luffy001 ~]# fdisk -l Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 ...

  7. SpringBoot系列__01HelloWorld

    接触SpringBoot很久了,但是一直没有很深入的研究一下源码,最近重启了博客,顺便开始深入研究一下技术. 1.简介 参照官方文档的说法,SpringBoot的设计理念就是为了简化Java程序员搭建 ...

  8. 小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式:

    小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式: 直接引用VUE; 将vue.js下载到本地后本目录下使用; 安装Node环境下使用; ant-desig ...

  9. Factory Method工厂方法模式

    定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类,属于创建型模式 在此模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类负责生产 ...

  10. shell脚本中添加用户并设置密码

    有时候在初始化shell脚本中希望能顺便创建用户并指定密码,使用useradd命令可以达到该效果: useradd -m -p encryptedPassword username 参数说明: -m ...