中文单词,UnicodeEncodeError:'ascii'编解码器不能编码55-56位的字符:序数不在范围内(128)

时间:2016-04-05 12:10:17

标签: python python-3.5

#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

裁剪是一个中文单词,不应更改或删除。 如果它已被删除,数据将出错....

2 个答案:

答案 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

尝试使用此功能对您的网址进行编码。