Čínské slovo, UnicodeEncodeError: ‚ascii‘ kodek nemůže kódovat znaky v pozici 55-56: Pořadové není v rozsahu (128)

hlasů
-2
#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()

A to ukazuje chybu:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 55-56: ordinal not in range(128)

Součástí omyl zprávou:

------ UnicodeEncodeError TraceBack (poslední hovor poslední) v () 92 tisk (len (gobou_data)) # zkouška 93 návrat gobou_data ---> 94 rawdata = rundatacircle () 95 96 # 開始 按照 月份 把 資料 載 下來, 從 今天 所屬 的 這個 月, 一直 自動 存 到 資料 的 最 開頭 101.01.01

V rundatacircle () 87 url = url 88 print (url) #test ---> 89 urllib.request.urlretrieve (url, data.gz) # python 3 dostat fotky z 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 v urlretrieve (url, název souboru, reporthook, data) 185 url_type, path = splittype (url) 186 -> 187 s contextlib.closing (urlopen (uRL, data)) jako fP: 188 záhlaví = fp.info () 189

.... to je velmi dlouhý, takže si nemyslím, seznam celou zprávu.

Snažil jsem se mnoho metod na Googlu a stackflow, ale tento problém nemůže vyřešit. A nemohu pochopit, co to znamená k chybě.

ps Problém v této části kódu. A já používám Python 3.5

Plodina je čínské slovo, a to by se nemělo měnit nebo mohou být odstraněny. Kdyby to byl odstraněn, budou data pokazí ....

Položena 05/04/2016 v 11:10
uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Váš problém je, že ‚ascii‘ kódování použít ke kódování adresy URL nerozumí čínské znaky.

Po krátkém WebSearch jsem našel 18030 kódování GB, která podporuje čínské znaky. https://en.wikipedia.org/wiki/GB_18030

Snažte se používat tento zakódovat adresu URL

Pozdravy

Odpovězeno 05/04/2016 v 12:08
zdroj uživatelem

hlasů
0

Nakonec jsem našel způsob, jak vyřešit tento problém, a to šlo do dvou částí.

Za prvé, změnit kódování čínské slova na 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

a pak načíst data, tvoří tento seznam.

#     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'))

dávat pozor na to, zda je funkce mají kódování nebo dekódování. Můžete to zkontrolovat pomocíprint(dir(XXX))

(Můžete vidět, že se to pochopit: Python 3 chyba dílčího v bajtech )

Odpovězeno 06/04/2016 v 02:58
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more