关于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. Python中yield解析

    小探yield 查看 python yield 文档 yield expressions: Using a yield expression in a function's body causes t ...

  2. fdfsdf

    名称:字符串 来源:2019年陕西省选 题目内容 传送门 洛谷(P5392) 题目描述 给出一个长度为$n$的由小写字母组成的字符串$a$,设其中第$i$个字符为$a_i(1≤i≤n)$. 设删掉第$ ...

  3. [code] python+selenium实现打开一个网页

    转载自: http://www.cnblogs.com/fnng/archive/2013/05/29/3106515.html http://www.testwo.com/blog/6931 在ec ...

  4. 洛谷P1196[NOI2002]银河英雄传说-并查集扩展

    银河英雄传说 题意:在并查集的基础上,还要求出同一集合的两个点的距离 这道题用并查集自己是知道的,但是竟然可以这么骚的操作. 下面转自大佬的查详细题解 初见这道题,首先想到的方法当然是直接模拟,模拟每 ...

  5. codeforces 807 C. Success Rate(二分)

    题目链接:http://codeforces.com/contest/807/problem/C 题意:记 AC 率为当前 AC 提交的数量 x / 总提交量 y .已知最喜欢的 AC 率为 p/q ...

  6. 利用PIL库创建空白图像

    背景 最近,想自己生成带位置坐标的文字数据集来训练文本位置探测网络. 理想情况是,给文字加盐噪声,背景不需要加噪声,所以需要创建一个空白的背景.将文字放在空白背景上,然后利用opencv加噪声. 解决 ...

  7. Spring.Net是怎么在MVC中实现注入的(原理)

    本文将介绍Spring.Net(不仅仅是Spring.Net,其实所有的IoC容器要向控制器中进行注入,原理都是差不多的)在MVC控制器中依赖注入的实现原理,本文并没有关于在MVC使用Spring怎么 ...

  8. 【Offer】[6] 【从尾到头打印链表】

    题目描述 思路分析 Java代码 代码链接 题目描述 从尾到头打印链表,将其添加到ArrayList当中输出 思路分析 递归的思路 利用栈 Java代码 public class Offer006 { ...

  9. 【LeetCode】22-生成括号

    22-生成括号 题目描述 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", ...

  10. Go语言基础之指针

    区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 Go语言中的函数传参都是值拷贝 ...