python 解析json typeerror_关于Python json解析过程遇到的TypeError: expected string or buffer...

本文讲述了在Python中解析JSON数据时遇到的TypeError问题,包括处理从网站爬取的不规则JSON数据,使用selenium+phantomjs模拟爬取以避免数据清洗,以及通过dumps和loads解决'expected string or buffer'错误的方法。通过实例展示了如何解决这些常见的JSON解析问题。
摘要由CSDN通过智能技术生成

关于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

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

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

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

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

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

TypeError: expected string or buffer的解决方法

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

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

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

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

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

Python json解析

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

python json 解析

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

随机推荐

Selenium3.0 自动化测试

早在2013年的时候,Selenium官方宣布,Selenium新的版本会在圣诞节的时候发布.但是,他们并没有说哪一个圣诞节发布. 转眼的三年过去了,目前已经发布到Selenium3.0 beta4版 ...

mysql while,loop,repeat循环,符合条件跳出循环

1.while循环 DELIMITER $$ DROP PROCEDURE IF EXISTS `sp_test_while`$$ CREATE PROCEDURE `sp_test_while`( ...

mysql 实现oracle start with connect by递归

在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. ...

基于WebForm+EasyUI的业务管理系统形成之旅 -- 施工计划安排(Ⅶ)

上篇,主要介绍首页随客户喜好安排区块位置,更好的实现用户体验. 这两天将项目中施工计划管理归纳总结 ...

opencv 中cvZero()的使用

cvZero(CvArr* ar); // 是让矩阵的值都为0,有初始化的作用, Eg:   IplImage img=cvCreateImage(cvSize(640,480),IPL_DEPTH_ ...

hbase snapshot 表备份/恢复

snapshot其实就是一组metadata信息的集合,它可以让管理员将表恢复到以前的一个状态.snapshot并不是一份拷贝,它只是一个文件名的列表,并不拷贝数据.一个全的snapshot恢复以为着 ...

【EMV L2】CDA复合动态数据认证/应用密文生成

复合动态数据认证/应用密文生成处理流程:对于复合动态数据认证/应用密文生成,终端执行标准动态数据认证的步骤1到3:1.认证中心公钥的获取终端使用认证中心公钥索引(PKI)以及卡片中的注册的应用提供商标 ...

python3下最简单的九九乘法表

def minus(): print("=========================九九乘法表===========================") x=1 y=1 wh ...

MapReduce-WordCount

pom.xml <?xml version="1.0" encoding="UTF-8"?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值