Python 如何将Py3k HTTPResponse转储到json.load中?
我原以为Python 如何将Py3k HTTPResponse转储到json.load中?,python,json,python-3.x,urllib2,Python,Json,Python 3.x,Urllib2,我原以为json.load()应该能够像http.client.HTTPResponse一样读取对象,但它的read()。(我正在使用Python3.3。)令我惊讶的是,我发现没有任何资源可以直接解决这个问题,尽管我认为这是一个主要的用例 import urllib.request, json # Y!F url yf = 'http://d.yimg.com/autoc.finance.yahoo.com/autoc' # Mock lookup data = urllib.parse.u
json.load()
应该能够像http.client.HTTPResponse
一样读取对象,但它的read()。(我正在使用Python3.3。)令我惊讶的是,我发现没有任何资源可以直接解决这个问题,尽管我认为这是一个主要的用例
import urllib.request, json
# Y!F url
yf = 'http://d.yimg.com/autoc.finance.yahoo.com/autoc'
# Mock lookup
data = urllib.parse.urlencode({'query': 'Ford', 'callback': 'YAHOO.Finance.SymbolSuggest.ssCallback'})
data = data.encode('utf-8')
request = urllib.request.Request(yf)
request.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.14 (KHTML, like Gecko) Version/6.0.1 Safari/536.26.14')
request.add_header('Content-type','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8;charset=utf-8')
request.add_header('Accept','text/plain')
mock = urllib.request.urlopen(request, data)
json.load(mock)
这将导致以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/json/__init__.py", line 264, in load
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/json/__init__.py", line 309, in loads
return _default_decoder.decode(s)
File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/json/decoder.py", line 352, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: can't use a string pattern on a bytes-like object
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/json/_init__.py”,第264行,已加载
parse_常量=parse_常量,object_pairs_hook=object_pairs_hook,**千瓦)
文件“/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/json/_init__.py”,第309行,在loads中
返回\u默认\u解码器。解码
文件“/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/json/decoder.py”,第352行,在decode中
obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
TypeError:无法在类似字节的对象上使用字符串模式
这一问题已在上一个线程中解决:
(HT:Matthew Trevor)
还有,什么雅虎!这里返回的不仅仅是JSON对象,还有一个YAHOO.Finance.SymbolSuggest.ssCallback()
wrapper。脱衣可以解决问题。(尽管仍然很难过,但这是必要的。)
这项工作:
import urllib.request, json, re
# Y!F url
yf = 'http://d.yimg.com/autoc.finance.yahoo.com/autoc'
# Mock lookup
data = urllib.parse.urlencode({'query': 'Ford', 'callback': 'YAHOO.Finance.SymbolSuggest.ssCallback'})
data = data.encode('utf-8')
request = urllib.request.Request(yf)
response = urllib.request.urlopen(request, data)
j = json.loads(re.search(r'{.*}',response.readall().decode('utf-8')).group())
这已在前一个线程中解决:
(HT:Matthew Trevor)
还有,什么雅虎!这里返回的不仅仅是JSON对象,还有一个YAHOO.Finance.SymbolSuggest.ssCallback()
wrapper。脱衣可以解决问题。(尽管仍然很难过,但这是必要的。)
这项工作:
import urllib.request, json, re
# Y!F url
yf = 'http://d.yimg.com/autoc.finance.yahoo.com/autoc'
# Mock lookup
data = urllib.parse.urlencode({'query': 'Ford', 'callback': 'YAHOO.Finance.SymbolSuggest.ssCallback'})
data = data.encode('utf-8')
request = urllib.request.Request(yf)
response = urllib.request.urlopen(request, data)
j = json.loads(re.search(r'{.*}',response.readall().decode('utf-8')).group())
看来你可能碰到了这个问题:@MatthewTrevor,真的,谢谢。readall encode loads解决方案让我走得更远,但只有这一步:ValueError:没有JSON对象可以被解码
我非常确定Yahoo!从我问题中的URL返回一个JSON对象。我现在做错了什么?(我知道,可能与原来的问题无关。)我明白了。因为它有一个围绕JSON对象的函数包装器。我以为这就是它的工作原理。现在已修复。看来您可能遇到了此问题:@MatthewTrevor,的确,谢谢。readall encode loads解决方案让我走得更远,但只有这一步:ValueError:没有JSON对象可以被解码
我非常确定Yahoo!从我问题中的URL返回一个JSON对象。我现在做错了什么?(我知道,可能与原来的问题无关。)我明白了。因为它有一个围绕JSON对象的函数包装器。我以为这就是它的工作原理。现在修复。我无法让雅虎财务链接工作,抱歉,所以我没有看到包装。很高兴你解决了!很抱歉,我无法让Yahoo Financials链接正常工作,所以我没有看到包装器。很高兴你解决了!