天行數據api接口數據搜索問題

2019/12/3

天行數據"垃圾分類"Python版api接口問題。(Python版本、中文字符)

0.天行數據提供api接口,利用這些可以做一些事情,比如做個Web端垃圾查詢的功能。
1.以下是天行數據參考代碼中Python的實例,不過很明顯,這是Python2的例子。

# -*- coding: utf-8 -*-
import sys, urllib, urllib2, json

url = 'http://api.tianapi.com/txapi/lajifenlei/index?key=APIKEY&word=眼鏡'

req = urllib2.Request(url)

resp = urllib2.urlopen(req)
content = resp.read()
if(content):
    print(content)

2.經過改寫,Python3版本如下:

import urllib.request
key = '************'
word = '手機'
url = "http://api.tianapi.com/txapi/lajifenlei/index?key={}&word={}".format(key, word)
req = urllib.request.urlopen(url)
content = req.read()
if(content):
    print(content)

Python3中已沒有urllib2,只有urllib,所以需要修改代碼,導入包時,需要直接導入request,
但是代碼出現錯誤,如下:

File "E:/PyCharmCode/pycharm_Code/01/garbage_sort.py", line 29, in <module>
    req = urllib.request.urlopen(url)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 50-51: ordinal not in range(128)

應該是url編碼問題,猜測是中文字符"手機"的問題,將word=“手機”,換成word=‘iphone’,成功獲取到結果。
雖然得到結果,確實是非中文字符,對content內容進行utf-8解碼:content = req.read().decode(“utf-8”),得到中文結果。
也確定了問題是url中含有中文,查看Python官網3.7.5版本的文檔,提到:

"以百分比編碼的ASCII文本字符串。
如果將結果字符串用作通過urlopen()函數進行POST操作的數據,則應將其編碼爲字節,否則將導致TypeError。"

原來是需要將url字符串轉爲百分比編碼,原因是中文字符串無法編碼成爲ascii碼。
所以我們只需要對中文進行百分號編碼之後,就可以encode爲ascii了。
Python3中我們可以在urllib.request找到官方提供的與中文編碼相關的函數:quote()。


3.最終代碼如下:

import json
import urllib.request

key = '************'
word = '手機'
word_quote = urllib.request.quote(word)
url = "http://api.tianapi.com/txapi/lajifenlei/index?key={}&word={}".format(key, word_quote)
req = urllib.request.urlopen(url)
content = req.read().decode("utf-8") 
jsonResponse = json.loads(content)  # 將數據轉化爲json格式
print(jsonResponse)

4.以上代碼中key的值需要註冊天行數據賬號獲取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章