2016-04-05 4 views
-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() 

Und es zeigt einen Fehler:chinesische Wort, UnicodeEncodeError: 'ascii' Codec kann nicht Zeichen in Position codieren 55-56: ordinal nicht in Reichweite (128)

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

Der Teil der Fehler Nachricht:

------ UnicodeEncodeError Traceback (most recent call last) in() 92 print(len(gobou_data))#test 93 return gobou_data ---> 94 rawdata = rundatacircle() 95 96 #開始按照月份把資料載下來,從今天所屬的這個月,一直自動存到資料的最開頭101.01.01

in rundatacircle() 87 url = url 88 print(url)#test ---> 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 in urlretrieve(url, filename, reporthook, data) 185 url_type, path = splittype(url) 186 --> 187 with contextlib.closing(urlopen(url, data)) as fp: 188 headers = fp.info() 189

.... es ist sehr lang, so dass ich Liste nicht die gesamte Nachricht.

Ich hatte viele Methoden auf Google und Stackflow versucht, konnte aber dieses Problem nicht lösen. Und ich kann nicht verstehen, was der Fehler bedeutet.

p.s. Ein Problem in diesem Teil des Codes. Und ich benutze Python 3.5

Crop ist ein chinesisches Wort, und es sollte nicht ändern oder gelöscht werden. Wenn es gelöscht wurde, gehen die Daten falsch ....

+3

http://stackoverflow.com/questions/9942594/unicodeencodeerror-ascii-codec-cant-encode-character-u- xa0-in-position-20? rq = 1 – Paul

+0

Sorry, aber es scheint, dass Sie nicht die Ergebnisse Ihrer Suchen gelesen haben, sehen Sie die Antworten in den Duplikaten ... Ie .: http://StackOverflow.com/Questions/3224268/ python-unicode-encode-error – bufh

+0

@bufh, danke. ja, aber das chinesische Wort wird verschwinden .... Wenn das chinesische Wort verschwinden, kann ich nicht die Daten erhalten, die ich will – YannYann

Antwort

0

Ihr Problem ist, dass die 'ascii' Codierung, die Sie verwenden, um Ihre URL zu codieren, die chinesischen Zeichen nicht versteht.

Nach einer kurzen Websuche fand ich die Kodierung GB 18030, die chinesische Schriftzeichen unterstützt. https://en.wikipedia.org/wiki/GB_18030

versuchen, dies zu benutzen, um Ihre URL

Grüße

+0

Sorry, 'ascii' Codierung ist mein Versuch, ich vergesse diese Zeile zu löschen ... und 'url = url.encode ('GB18030')' auch falsch gehen – YannYann

+0

die URL wird: b'http: // m. coa.gov.tw/OpenData/FarmTransData.aspx?$top=700&$skip=0&crop=\xc5\xa3\xdd\xf2&StartDate=105.04.01&EndDate=105.04.05&Market=\xcc\xa8\xb1\xb1\xd2\xbb ' – YannYann

+0

Ich sehe nicht den Sinn, exotische Kodierungen aus der Vergangenheit zu verwenden, während utf-8 die Aufgabe perfekt erfüllen wird (und auch zufällig die [von URIs verwendete Kodierung] ist (http://tools.ietf.org/html)/rfc3986)). – spectras

0

schließlich zu kodieren, fand ich eine Methode, um dieses Problem zu lösen, und es ging in zwei Teil.

Zuerst ändern Sie die Codierung der chinesischen Wort in 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 

und dann die Daten dieser Liste bilden laden.

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

aufpassen, ob die Funktion codieren oder decodieren. Sie können dies überprüfen, indem print(dir(XXX))

(können Sie sehen, dies zu verstehen: python 3 subprocess error in bytes)

Verwandte Themen