Python爬蟲之XML

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>]
相關文章
相關標籤/搜索