#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 打印(镜头(gobou_data((#test 93 返回gobou_data ---> 94 原始数据 = 运行数据圈(( 95 96 #開始按照月份把資料載下來,從今天所屬的這個月,一直自動存到資料的最開頭101.01.01
在 rundatacircle(( 中 87 网址 = 网址 88 打印(网址(#test ---> 89 urllib.request.urlretrieve(url, "data.gz"(#python 3 从 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 In urlretrieve(URL, filename, reporthook, data( 185 url_type,路径 = 拆分类型(URL( 186 --> 187 的 contextlib.closing(urlopen(url, data(( 作为 fp: 188 个标头 = fp.info(( 189
....它很长,所以我不列出整个消息。
我在Google和stackflow上尝试了很多方法,但无法解决这个问题。而且我不明白错误的含义。
附言这部分代码存在问题。我使用python 3.5
裁剪是一个中文单词,它不应该改变或删除。如果它已被删除,数据将出错。
最后,我找到了解决这个问题的方法,它分为两部分。
首先,我更改了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 子进程错误以字节为单位(
您的问题是用于编码URL的"ASCII"编码无法理解中文字符。
经过短暂的网络搜索,我找到了支持汉字的GB 18030编码。https://en.wikipedia.org/wiki/GB_18030
尝试使用它来编码您的 URL。