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

而且它顯示了一個錯誤:中國字,UnicodeEncodeError: 'ASCII' 編解碼器在55-56位置無法編碼的字符:在範圍序數不(128)

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

錯誤的部分消息:

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

....它很長,所以我沒有列出整個消息。

我曾嘗試過Google和stackflow上的很多方法,但無法解決這個問題。我無法理解錯誤的含義。

p.s.這部分代碼存在問題。我使用Python 3.5

作物是一箇中文詞,它不應該改變或被刪除。 如果它已被刪除,數據將出錯....

+3

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

+0

對不起,但你似乎沒有閱讀你的搜索結果,看到重複的答案...即:http://stackoverflow.com/questions/3224268/ python-unicode-encode-error – bufh

+0

@bufh,謝謝。 是的,但中文單詞會消失.... 如果中文單詞消失,我無法獲取我想要的數據 – YannYann

回答

0

你的問題是,你用來編碼你的URL的'ascii'編碼不理解中文字符。

經過短暫的網絡搜索,我找到了支持中文字符的GB 18030編碼。 https://en.wikipedia.org/wiki/GB_18030

嘗試使用此編碼您的網址

問候

+0

對不起,'ascii'編碼是我的嘗試,我忘記刪除這一行... 和'url = url.encode('GB18030')'也出錯了 – YannYann

+0

的網址將是: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

我沒有看到從過去使用異域編碼的觀點,而utf-8將完美地完成這項工作(並且恰好是URI使用的編碼方式)(http://tools.ietf.org/html/RFC3986))。 – spectras

0

最後,我找到了解決這個問題的方法,並走進兩個部分。

首先,我改變中國字的編碼,網址:

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

相關問題