#python 3 version
...
#關於產地
...
crop = '牛蒡'
...
#要求輸入資料
def rundatainputcircle():
marketinput = input('*請擇一輸入: 1:台北一, 2:台北二, 3:三重市, 4:台中市, 5:高雄市, 6:鳳山市, 7:桃園縣 或是不填寫 > ')
if marketinput == '':
market = ''
elif len(str(marketinput)) ==1 and 1 <= int(marketinput) <= 7:
market = uriba[uribalist[int(marketinput)-1] + 1]
else:
print('請重新輸入:1:台北一, 2:台北二, 3:三重市, 4:台中市, 5:高雄市, 6:鳳山市, 7:桃園縣 或是不填寫 > ')
rundatainputcircle()
rundatainputcircle()
#匯入資料
def rundatacircle():
url = 'http://m.coa.gov.tw/OpenData/FarmTransData.aspx?' + '$top=' + top + '&$skip=0&crop=' + crop + '&StartDate=' + startdate + '&EndDate=' + enddate
if market != '':
url += '&Market=' + market
else:
url = url
url = url.encode('ascii')
print(url)#test
urllib.request.urlretrieve(url, "data.gz")
data_str = open('data.gz', 'r').read()#gzip.open('data.gz', 'r').read()
gobou_data = json.loads(data_str)
print(len(gobou_data))#test
return gobou_data
rawdata = rundatacircle()
它显示了一个错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 55-56: ordinal not in range(128)
错误信息的一部分:
------()中的UnicodeEncodeError Traceback(最近一次调用最后一次) 92打印(len(gobou_data))#test 93返回gobou_data ---&GT; 94 rawdata = rundatacircle() 95 96#开始按照月份把资料载下来,从今天所属的这个月,一直自动存到资料的最开头101.01.01
in rundatacircle() 87网址=网址 88 print(url)#test ---&GT; 89 urllib.request.urlretrieve(url,“data.gz”)#python 3 getting pics from url 90 data_str = open('data.gz','r')。read()#gzip.open('data.gz','r')。read() 91 gobou_data = json.loads(data_str)
/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py 在urlretrieve中(url,filename,reporthook,data) 185 url_type,path = splittype(url) 186 - &GT; 187使用contextlib.closing(urlopen(url,data))作为fp: 188 header = fp.info() 189
....它很长,所以我没有列出整个信息。
我在Google和stackflow上尝试了很多方法,但无法解决这个问题。我无法理解错误的含义。
P.S。这部分代码存在问题。我使用python 3.5
裁剪是一个中文单词,不应更改或删除。 如果它已被删除,数据将出错....
答案 0 :(得分:1)
最后,我找到了解决这个问题的方法,它分为两部分。
首先,我在url中更改中文单词的编码:
url = 'http://m.coa.gov.tw/OpenData/FarmTransData.aspx?$top=' + top +
'&$skip=0&' + urllib.parse.urlencode({'crop': crop}) + '&StartDate=' + startdate + '&EndDate=' + enddate
if market != '':
url += '&' + urllib.parse.urlencode({'Market': market})
else:
url = url
然后从此列表中加载数据。
# print(type(url))
# print(dir(url))
data = urllib.request.urlopen(url).read().decode('utf-8')#https://stackoverflow.com/questions/28906859/module-has-no-attribute-urlencode
# print(type(data))
# print(dir(data))
result = json.loads(data)
# result = json.loads(response.readall().decode('utf-8'))
注意该功能是否具有编码或解码功能。
您可以通过print(dir(XXX))
(你可以看到这一点:python 3 subprocess error in bytes)
答案 1 :(得分:0)
您的问题是您用来编码网址的'ascii'编码无法理解中文字符。
经过简短的网络搜索,我发现支持中文字符的GB 18030编码。 https://en.wikipedia.org/wiki/GB_18030
尝试使用此功能对您的网址进行编码。