关于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. Badboy - 导出脚本,用于JMeter并发测试

    参考: http://leafwf.blog.51cto.com/872759/1141011 http://www.51testing.com/html/00/130600-1367743.html ...

  2. HDU-5977 - Garden of Eden 点分治

    HDU - 5977 题意: 给定一颗树,问树上有多少节点对,节点对间包括了所有K种苹果. 思路: 点分治,对于每个节点记录从根节点到这个节点包含的所有情况,类似状压,因为K<=10.然后处理每 ...

  3. CodeForces - 697C-Lorenzo Von Matterhorn(有点像LCA,原创

    传送门: CodeForces - 697C 原创--原创--原创 第一次自己A了一道感觉有点难度的题: 题意:在一个类似于二叉树的图上,1 : u ,v,w 表示从u到v的所以路都加上w的费用: 2 ...

  4. Codeforces Round #481 (Div. 3) A. Remove Duplicates

    题目地址:http://codeforces.com/contest/978/problem/A 题解:给一串长度为n的数组,然后删去相同的数字(从右往左). 方法:题目n和数组ai给的范围都很小,所 ...

  5. java hdu A+B for Input-Output Practice (IV)

    A+B for Input-Output Practice (IV) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/327 ...

  6. 02 python 必知

    一.变量 1.变量的定义 将程序运算的中间结果临时存在内存里,以便后续代码调用. 2.变量的使用规范 1)变量必须要有数字,字母,下划线,任意组合. 2)变量不能数字开头. 3)不能是python中的 ...

  7. Android源码阅读技巧--查找开发者选项中显示触摸操作源码

    在开发者模式下,在开发者选项中,可以勾选“显示触摸操作”,然后只要点击屏幕就会在点击的位置有圈圈显示.如何找到绘制圈圈的代码部分,有什么技巧来阅读代码量这么大的android系统源码呢?以下请跟着小老 ...

  8. Java面试-动态规划与组合数

    最近在刷力扣上的题目,刷到了65不同路径,当初上大学的时候,曾在hihocoder上刷到过这道题目,但是现在已经几乎全忘光了,大概的知识点是动态规划,如今就让我们一起来回顾一下. 从题目说起 题目原文 ...

  9. WoSign新证书系统通过德国Cure53安全测试

    近日,沃通WoSign新证书系统顺利通过德国Cure53白盒子安全测试,并公开发布审计报告总结版. 据悉,根据去年10月份Mozilla提出的整改要求,沃通WoSign投入研发力量高标准严要求地重新开 ...

  10. [1]尝试用Unity3d制作一个王者荣耀(持续更新)->AssetBundle管理器

    如果已经看过本章节:目录传送门:这是目录鸭~ 1.AssetBundleManager: 首先我们创建一个文件夹,叫AssetBundleManager,再创建Csharp(即C#)脚本,名为Asse ...