在上一篇 使用selenium找出外賣點餐次數最多的10個顧客 中,抓取信息后只輸出了點餐次數TOPN的顧客,其實可以把信息保存到本地,便於做更多的統計。
為了便於后續的讀取處理,這里就將信息保存在xml文件中,想到得到的文件如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <orderlist> 3 <order> 4 <customer>姓名1</customer> 5 <phone>電話1</phone> 6 <address>地址1</address> 7 <count>點餐次數1</count> 8 </order> 9 <order> 10 <customer>姓名2</customer> 11 <phone>電話2</phone> 12 <address>地址2</address> 13 <count>點餐次數2</count> 14 </order> 15 </orderlist>
Python寫xml比較簡單,直接使用minidom即可。
思路也比較簡單,因為dom文檔就是一棵樹,每一個標簽都是一個節點,包括文本內容也是節點,因此從根節點開始,把節點一級一級的插入即可。
在上一篇中已經將抓取的信息存入了字典orderDict中,這里我們直接在類Order中添加一個方法,將orderDict里面的每一項信息插入DOM樹,然后再寫入本地xml文件。
由於比較簡單,直接給出代碼:
1 from xml.dom.minidom import Document 2 # 將self.orderDict中的信息寫入本地xml文件,參數filename是xml文件名 3 def writeInfoToXml(self, filename): 4 # 創建dom文檔 5 doc = Document() 6 7 # 創建根節點 8 orderlist = doc.createElement('orderlist') 9 # 根節點插入dom樹 10 doc.appendChild(orderlist) 11 12 # 依次將orderDict中的每一組元素提取出來,創建對應節點並插入dom樹 13 for (k, v) in self.orderDict.iteritems(): 14 # 分離出姓名,電話,地址,點餐次數 15 (name, tel, addr, cnt) = (v[0], k, v[1], v[2]) 16 17 # 每一組信息先創建節點<order>,然后插入到父節點<orderlist>下 18 order = doc.createElement('order') 19 orderlist.appendChild(order) 20 21 # 將姓名插入<order>中 22 # 創建節點<customer> 23 customer = doc.createElement('customer') 24 # 創建<customer>下的文本節點 25 customer_text = doc.createTextNode(name) 26 # 將文本節點插入到<customer>下 27 customer.appendChild(customer_text) 28 # 將<customer>插入到父節點<order>下 29 order.appendChild(customer) 30 31 # 將電話插入<order>中,處理同上 32 phone = doc.createElement('phone') 33 phone_text = doc.createTextNode(tel) 34 phone.appendChild(phone_text) 35 order.appendChild(phone) 36 37 # 將地址插入<order>中,處理同上 38 address = doc.createElement('address') 39 address_text = doc.createTextNode(addr) 40 address.appendChild(address_text) 41 order.appendChild(address) 42 43 # 將點餐次數插入<order>中,處理同上 44 count = doc.createElement('count') 45 count_text = doc.createTextNode(str(cnt)) 46 count.appendChild(count_text) 47 order.appendChild(count) 48 49 # 將dom對象寫入本地xml文件 50 with open(filename, 'w') as f: 51 f.write(doc.toprettyxml(indent='\t', encoding='utf-8')) 52 53 return
在先調用getAllOrders方法之后,再調用writeInfoToXml即可將所有信息寫入xml文件中。