1、請求參數形式爲xmlhtml
舉例說明。python
如今有這樣一個網址:https://www.runff.com/html/live/s1484.html;想要查詢圖片列表,打開F12,觀察到請求以下:json
這裏的請求參數形式爲xml,使用python模仿請求的代碼這樣寫api
import requests fid = 3748813 bib = 25001 url = "https://www.runff.com/html/live/s1484.html" params = { "isbxapimode": "true", "_xmltime": "1543561724351.0.3817698648690635" } headers = { "cookie": "ASP.NET_SessionId=hb30jkbmqnfwyhjo0iqrrkdi", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36", } payload = '<?xml version="1.0" encoding="utf-8"?><BxMessage><AppId>BxAPI</AppId><Type>1</Type>' \ '<Action>getPhotoList</Action><Data><fid>{}</fid>' \ '<number>{}</number><minpid>0</minpid>' \ '<time>Wed Nov 21 2018 14:21:42 GMT+0800 (中國標準時間)</time><sign>false</sign>' \ '<pagesize>100</pagesize></Data></BxMessage>'.format(fid, bib) payload = payload.encode('utf-8') r = requests.post(url, headers=headers, params=params, data=payload, timeout=3) print(r.content.decode('utf-8'))
這裏主要使用了post方法,將xml的參數直接以字符串的形式傳給post的‘data’參數。cookie
能夠看到咱們返回內容也是xml。這個時候就須要解析xml。app
2、xml解析post
xml原文(與上文的請求返回結果無關):url
<?xml version="1.0" encoding="utf-8"?> <BxMessage> <AppId>BxAPI</AppId> <Type>2</Type> <Action>getPhotoList</Action> <StateCode>2</StateCode> <Message index="0">請先登陸</Message> <Message index="1">ok</Message> <Data></Data> </BxMessage>
1.直接轉成json處理spa
使用 xmltodict 庫code
代碼:
from xmltodict import parse xml = '<?xml version="1.0" encoding="utf-8"?><BxMessage><AppId>BxAPI</AppId><Type>2</Type>' \ '<Action>getPhotoList</Action><StateCode>2</StateCode><Message index="0">請先登陸</Message>' \ '<Message index="1">ok</Message><Data></Data></BxMessage>' data = parse(xml) # 解析xml爲有序字典 print(data) box = data.get('BxMessage', {}) # 獲取最外層的標籤 app_id = box.get('AppId') # 獲取次外層的標籤 print(app_id) msg = box.get('Message', []) # 多個標籤名相同時,獲取到的是標籤列表 for m in msg: print(m.get('@index')) # 獲取屬性,使用'@'前綴 print(m.get('#text')) # 獲取標籤文本,使用'#text'
輸出:
OrderedDict([('BxMessage', OrderedDict([('AppId', 'BxAPI'), ('Type', '2'), ('Action', 'getPhotoList'), ('StateCode', '2'), ('Message', [OrderedDict([('@index', '0'), ('#text', '請先登陸')]), OrderedDict([('@index', '1'), ('#text', 'ok')])]), ('Data', None)]))]) BxAPI 0 請先登陸 1 ok
輸出的是有序字典,取值能夠和字典同樣使用「get」。
假設有多個相同標籤,轉換成字典時,會將相同關鍵字的值組成一個列表。
2.直接解析xml
使用上文中的xml
簡要解析代碼:
from xml.etree import ElementTree xml = '<?xml version="1.0" encoding="utf-8"?><BxMessage><AppId>BxAPI</AppId><Type>2</Type>' \ '<Action>getPhotoList</Action><StateCode>2</StateCode><Message index="0">請先登陸</Message>' \ '<Message index="1">ok</Message><Data></Data></BxMessage>' tree = ElementTree.fromstring(xml) # 從字符串解析獲得xml結構 print(tree) # tree是一個xml 元素, BxMessage box = tree.find('Message') # 找tree下一級的標籤 print(box) # box是一個xml 元素, BxMessage print(box.text) # 輸出標籤的內容 print(box.get('index')) # 獲取標籤屬性 boxes = tree.findall('Message') # 找到全部該名字的標籤, print(boxes) # 返回一個列表
輸出:
<Element 'BxMessage' at 0x00000217E207D368> <Element 'Message' at 0x00000217E9CB0958> 請先登陸 0 [<Element 'Message' at 0x00000217E9CB0958>, <Element 'Message' at 0x00000217E9CB98B8>]