怎樣將xml批量導入excel?
事情是這樣的,手上有幾千個url,url對應的是xml,想要把這些xml包含的數據導入到excel裡面去,目前嘗試下來有一下三種途徑:
1.excel導入數據&>來自網站,然後在彈出的瀏覽器里輸入url,即可導入成功,但是這樣要一次一次來做,沒有辦法批量完成,求大神指教怎樣批量完成。2.execl導入數據&>來自其他源&>來自xml數據導入,然後貼上url,也可導入完成,但是同樣無法批量完成。3.將url直接下載下來,然後將這些xml文件在同一張表中打開,本來覺得簡單又可行,可是發現下載這些url對應的文件名完全一樣,因此產生了無法區分的問題。
這個問題可以用VBA來處理,寫一個循環與判斷語句就行了,不過麻煩的是,有些網站是不支持EXCEL去讀取導入並循環更新的
EXCEL讀取網頁的時候,對於表的處理是先判斷網頁的框架,然後再判斷表在哪一個框架裡面的,然後定義一個表的號碼,這樣就比較容易導入,如果表是用其它語言寫的,動態的,或不是框架裡面的,往往就沒辦法處理
我來回答這個問題。
什麼是xml,什麼是excel?
她們兩種都是一種文件格式,屬於文本文件。計算機裡面要存放數據,一般都是存放在文件中,有些是文本文件,有些是二進位文件,比如圖片是二進位文件,你用文本編輯器打開會看到亂碼,而一些文件打開,你大致讀得懂就是文本文件。資料庫存放的數據底層也是存放在文件裡面。
好!xml是一種擴展標記語言,是html的超集,具體請百度。你可自己定義標記,比如&<愛我&>才怪&愛我&>,哈哈哈哈,大致是這樣。這樣的文本文件有層次結構,熟稱文檔對象模型DOM,或者直接叫文檔樹,有父母,兄弟,兒子,孫子等。這種格式的產生是為了數據的傳輸,因為http協議,一般我們做網站的時候要傳數據,xml就是一種很好的選擇,因為便於提取,雖然現在大部分已經用json了。我就不展開了,也可以把這個問題改為,怎樣將json批量導入excel?
為什麼要將數據導入到excel?
現在你要提取到excel,就是說你想整理這些數據,因為excel的功能就是簡單化數據處理,而不需要手動編程。。。你要提取愛我,才怪,這些你喜歡的標記裡面的內容或者屬性,便於統計整理。直接在文本編輯器編輯是不可能的,因為你打開xml文件是很難整理的。
而excel文件有個excel軟體在支持它,因為excel就像小型的資料庫,有行列嘛,想想access,然後還有mysql資料庫,現在的mongo db,redis等,其實就是一個數據的存儲地,但是有了一些其它的功能。。
如何導入excel?
切入正題,來回答乎主的問題。怎麼把xml提取到excel?
嗯,寫程序就行了。可以用Vb寫,這樣打開excel運行宏就行了,不過數據量一大就會特別慢。有一個懶人爬蟲軟體及搜客就經常有這種xml轉excel的需求,因為設計者當初把數據傳輸格式定為xml,所以有一班不是很專業,又很專業的人,寫了一些Vb程序,還行。但是,用JAVA,Go,Python解析xml是特別容易的,而且速度快。
程序演示
我已經寫好了一個軟體,請上github尋找:GitHub - hunterhug/xmlmerge: 及搜客XML合併程序 這個程序已經封裝成exe在Windows下可以直接運行。我來演示一下操作。
注意,這個程序只能處理及授課軟體生成的xml,有格式要求!!!注意,這個程序只能處理及授課軟體生成的xml,有格式要求!!!注意,這個程序只能處理及授課軟體生成的xml,有格式要求!!!這是程序目錄結構
-- exerun5.0 運行目錄&
-- xmlchange.exe 可執行文件&
-- files 需處理的XML(遞歸子文件夾)&
-- jingjie_詳情_175894040_1117385545.xml&
-- jingjie_詳情_175894040_111738554f.xml&
-- jingjie_詳情_1758940s_1117385545.xml&
-- source 源程序&
-- xmlchange.py 源代碼&
-- setup.py 打包配置&
--run.bat 批處理運行腳本
-- data 演示數據&
&
&
&
&
&
&
&
&
&
必須有有一個根元素包裹所有的子元素,然後必須有&
好醜,哈哈哈哈,然後運行程序。
生成了一個excel文件,這個處理的速度特別快,達到多快,麻煩大家幫我測試一下,或者有什麼bug也可以提出。
源代碼展示
# -*- coding:utf-8 -*-
# https://docs.python.org/2/library/xml.dom.html#dom-nodelist-objects
import xml.dom.minidom
import os.path
import time
from openpyxl import Workbook
start = time.clock()
wb=Workbook()
# sheet=wb.create_sheet(0,"爬蟲抓取表")
sheet=wb.create_sheet("爬蟲抓取表",0) # 2.3.5
i = 1
def get_xmlnode(node,name):
return node.getElementsByTagName(name) if node else []
def files(rootdir):
file = []
for parent,dirnames,filenames in os.walk(rootdir):
for filename in filenames:
if filename.endswith(".xml"):
file.append((parent+"/"+filename).replace("\","/"))
return file
def writedata(i,j,item):
if i == 1:
try:
sheet.cell(row = i,column= j).value = item.tagName
sheet.cell(row = i+1,column= j).value = item.firstChild.data.strip()
except:
sheet.cell(row = i,column= j).value = item.tagName
attrtext = []
for key in item.attributes.keys():
attrvalue = item.attributes[key]
attrtext.append(attrvalue.value)
sheet.cell(row = i+1,column= j).value = ",".join(attrtext)
else:
try:
sheet.cell(row = i+1,column= j).value = item.firstChild.data.strip()
except:
attrtext = []
for key in item.attributes.keys():
attrvalue = item.attributes[key]
attrtext.append(attrvalue.value)
sheet.cell(row = i+1,column= j).value = ",".join(attrtext)
def curitem(nodelist,v1,v2,v3,tag="item"):
if nodelist:
for node in nodelist:
nodelist2 = node.getElementsByTagName(tag) if node else []
islast = curitem(nodelist2,v1,v2,v3)
if islast==1:
items = node.childNodes
j=4
for item in items:
global i
writedata(i,j,item)
j=j+1
sheet.cell(row=i+1,column=1).value = v1
sheet.cell(row=i+1,column=2).value = v2
sheet.cell(row=i+1,column=3).value = v3
i=i+1
return 2
else:
return 1
def begin():
sangjin = """
"""
print(sangjin)
begin()
print("開始處理......")
path = "../爬蟲生成表.xlsx"
xmls = files("../files/")
erpath = []
en = 0 #錯誤數
sheet.cell(row=1,column=1).value = "線索ID"
sheet.cell(row=1,column=2).value = "網址路徑"
sheet.cell(row=1,column=3).value = "爬取時間"
for filename in xmls:
try:
doc =xml.dom.minidom.parse(filename)
root = doc.documentElement
noderoot = get_xmlnode(root,"item")
clueid = get_xmlnode(root,"clueid")
v1=clueid[0].childNodes[0].data
clueid1 = get_xmlnode(root,"uri")
v2=clueid1[0].childNodes[0].data
clueid2 = get_xmlnode(root,"createdate")
v3=clueid2[0].childNodes[0].data
curitem(noderoot,v1,v2,v3)
print("處理成功:"+filename)
except Exception as e:
#raise
en = en+1
erpath.append(filename+"
"+str(e))
pass
wb.save(path)
total = len(xmls)
if erpath:
print("-"*50)
print("提取失敗的文件:")
print("
".join(erpath))
print("-"*50)
print("總共處理XML條數:"+str(total))
print("提取XML失敗條數:"+str(en))
print("處理成功的XML條數:"+str(total-en))
print("生成記錄數:"+str(i-1))
print("-"*50)
end = time.clock()
print("程序總共運行時間 : %.03f 秒" %(end-start))
print("處理結束........")
input()
只使用了xml和excel的庫:
import xml.dom.minidom
from openpyxl import Workbook
代碼使用遞歸形式解析,很短很短,看看就知道了:
doc =xml.dom.minidom.parse(filename)
root = doc.documentElement
noderoot = get_xmlnode(root,"item")
clueid = get_xmlnode(root,"clueid")
v1=clueid[0].childNodes[0].data
clueid1 = get_xmlnode(root,"uri")
v2=clueid1[0].childNodes[0].data
clueid2 = get_xmlnode(root,"createdate")
v3=clueid2[0].childNodes[0].data
curitem(noderoot,v1,v2,v3)
print("處理成功:"+filename)
為了照顧那個懶人軟體,所以解析了clueid等標記,因為它自帶的,而主要的爬取數據是放在item標記裡面,如果你要處理自己的xml文件,請聯繫我,因為你也許看不懂代碼,哈哈哈哈。
------------------------------------我是分割線----------------------------------------------------------------------------
我到現在還沒有解決乎主的問題。。。。。
手上有幾千個url,url對應的是xml,怎麼解決。i可以直接爬取下來。將url寫在文件里,按行讀取url,然後寫個循環使用http get方式獲取下來。給個例子吧,Python爬取數據萬能函數:上面如果要使用Post進行數據抓取,請直接寫map,然後放在第三個參數。如果daili不是空的,就使用代理。著個涉及到反爬蟲的機制,如果有足夠多的人點贊,我就繼續寫。
代理文件daili.txt放在和源文件同級目錄,格式如下:
1.179.176.37:8080@HTTP#泰國 TOT公共有限公司
1.179.146.153:8080@HTTP#泰國 TOT公共有限公司
1.179.198.37:8080@HTTP#泰國 TOT公共有限公司
1.234.45.50:3128@HTTP#韓國 SK電訊
1.255.53.81:80@HTTP#韓國 SK電訊
5.22.195.148:80@HTTP#【匿】伊朗
5.135.161.61:3128@HTTP#法國
5.141.9.86:8080@HTTP#俄羅斯
5.160.247.16:8080@HTTP#伊朗
處理後會保存在daili1.txt裡面,可以打開看看。
這種代理IP去哪裡找呢?免費代理ip_httpip代理地址_qq代理伺服器
---------------------------------我又是分割線------------------------------------------------
寫了這麼多,貌似只講了一小部分。大家可以看我寫的另一篇文章,我沒時間寫太多,所以大部分都在腦里,有空會多來知乎吹水,剛剛入扎。
傳送門:
Python3中級玩家:淘寶天貓商品搜索爬蟲自動化工具(第一篇)------------------------------爬蟲技巧補充-----------------------------------------------
處理其他格式的xml,請仿照程序修改!!!由於沒有你的url,只能提供思路給你參考一下:
- 針對你的第1、2點,可以嘗試下錄製宏,或者直接編寫VBA。
- 針對第3點,可以使用批量重命名工具進行重命名再進行合併。(提供一個選擇給你:Win7xfolder-批量重命名 by 小眾軟體)
很簡單,使用交流 - 集搜客社區這裡有工具和教程,不過樓主最好用2010以上的excel版本,太老的版本不一定合適
題主可以試試我導入CSV的方法,步驟類似,不需要額外的vba或者工具。
Excel batch import data from CSV files / Excel 批量導入CSV文件
題主可以試試我導入CSV的方法,步驟類似,不需要額外的vba或者工具。
Excel batch import data from CSV files / Excel 批量導入CSV文件
推薦閱讀:
※Excel VBA入門(九)操作工作薄
※一張圖教你用VBA自定義排序
※【VBA初學者教程】- 第一章 VBA入門知識:用快捷記號引用單元格
※【VBA初學者教程】- 第一章 VBA入門知識:A1樣式引用單元格(區域)
TAG:XML | MicrosoftExcel | VBA | Excel使用 | MicrosoftExcel2013 |