2017-08-09 101 views
0

我正在使用可用的xml文件here解析XML的最佳方法

我想解析並加載LON, LAT, PGA, PGV, MMI, PSA03, PSA10, PSA30, STDPGA, URAT and SVEL作爲CSV文件的標題。

grid_data元素以空格定界符方式具有所有這些標頭的所有值。

我要尋找一個csv file output象下面這樣:

LON LAT PGA PGV MMI PSA03 PSA10 PSA30 STDPGA URAT SVEL 
-99.6833 38.2891 0.04 0.04 2.04 0.09 0.02 0 0.65 1 363.294 
-99.6666 38.2891 0.04 0.04 2.06 0.09 0.02 0 0.65 1 342.531 
-99.6500 38.2891 0.04 0.04 2.11 0.1 0.02 0 0.65 1 303.783 
-99.6333 38.2891 0.04 0.04 2.08 0.09 0.02 0 0.65 1 334.629 
-99.6166 38.2891 0.04 0.05 2.15 0.09 0.02 0 0.65 1 279.535 
-99.6000 38.2891 0.04 0.04 2.08 0.09 0.02 0 0.65 1 326.391 
-99.5833 38.2891 0.04 0.04 2.02 0.08 0.02 0 0.65 1 390.897 
-99.5666 38.2891 0.04 0.04 2.08 0.09 0.02 0 0.65 1 346.033 

後來,我用熊貓爲蟒蛇找到PGV最大價值,做我的GIS分析。

到目前爲止,這是我的代碼:

import sys 
import traceback 
from xml.dom import minidom 
import warnings 
warnings.filterwarnings("ignore") 

try: 
    print "*"*20 + " The Beginning " + "*"*20 

    xml_file_location = r"C:\Users\*****\Downloads\Grids\us2000a3y4_grid.xml" 
    xmldoc = minidom.parse(xml_file_location) 
    itemlist = xmldoc.getElementsByTagName('grid_field') 
    for item in itemlist: 
     print (item.attributes['name'].value) 



Catch all exception and print to the screen 
except: 
    e = sys.exc_info()[0] 
    print("Error: %s\n\n" % e) 

#Closing script 
finally: 
    print "*"*20 + " The End " + "*"*20 
+0

有你試過什麼? –

+0

編輯了這個問題並粘貼了我到目前爲止的代碼。 –

+0

是否有任何錯誤?輸出是什麼? –

回答

1

考慮簡單解析使用使用StringIO()內置etree並將其直接傳遞到pandas.read_tablegrid_data節點:

import pandas as pd 
import xml.etree.ElementTree as et 
from io import StringIO  
import requests as rq 

# RETRIEVE URL OBJECT 
r = rq.get('https://earthquake.usgs.gov/realtime/product/shakemap/us2000a3y4/us/1501736303313/download/grid.xml') 

# BUILD TREE FROM URL CONTENT 
doc = et.fromstring(r.content) 

# PARSE <grid_data> TEXT WITH UNDECLARED PREFIX NAMESPACE 
data = doc.find('.//{http://earthquake.usgs.gov/eqcenter/shakemap}grid_data').text 

# READ SPACE-DELIMITED STRING INTO DATAFRAME 
df = pd.read_table(StringIO(data), sep="\\s+", header=0, 
        names=['LON','LAT','PGA', 'PGV', 'MMI','PSA03','PSA10','PSA30','STDPGA','URAT','SVEL']) 

print(df.head()) 
#   LON  LAT PGA PGV MMI PSA03 PSA10 PSA30 STDPGA URAT  SVEL 
# 0 -100.3997 38.1145 0.01 0.01 1.77 0.02 0.01 0.0 0.65 1.0 354.533 
# 1 -100.3831 38.1145 0.01 0.02 1.82 0.02 0.01 0.0 0.65 1.0 310.786 
# 2 -100.3664 38.1145 0.01 0.01 1.77 0.02 0.01 0.0 0.65 1.0 354.545 
# 3 -100.3497 38.1145 0.01 0.01 1.76 0.02 0.01 0.0 0.65 1.0 362.307 
# 4 -100.3331 38.1145 0.01 0.01 1.76 0.02 0.01 0.0 0.65 1.0 360.332 

print(df.tail()) 
#    LON  LAT PGA PGV MMI PSA03 PSA10 PSA30 STDPGA URAT  SVEL 
# 105767 -94.4831 33.2425 0.01 0.01 1.78 0.02 0.01 0.0 0.65 1.0 337.237 
# 105768 -94.4664 33.2425 0.01 0.02 1.89 0.03 0.01 0.0 0.65 1.0 249.221 
# 105769 -94.4497 33.2425 0.01 0.02 1.83 0.02 0.01 0.0 0.65 1.0 297.622 
# 105770 -94.4331 33.2425 0.01 0.01 1.63 0.02 0.01 0.0 0.65 1.0 500.368 
# 105771 -94.4164 33.2425 0.01 0.01 1.77 0.02 0.01 0.0 0.65 1.0 340.302 
+0

感謝@parfait。不知道如何得到輸出,但代碼失敗,此消息。 'df = pd.read_table(StringIO(data),sep =「\\ s +」,header = 0,names = ['LON','LAT','PGA','PGV','MMI','PSA03 ','PSA10','PSA30','STDPGA','URAT','SVEL']) TypeError:initial_value必須是unicode或None,不是str' –

+0

我做了這個改變,它確實工作'data = unicode doc.find('.// {http://earthquake.usgs.gov/eqcenter/shakemap} grid_data').text)' 我的輸出在URAT值後仍然是'\',我的意思是SVEL值跳轉到一條新線。你是否應該怎麼做才能將所有內容放在同一行?謝謝。 –

+0

您正在運行什麼熊貓和python版本和操作系統?檢查'print(pd .__ version __)'我在這個解決方案中複製並粘貼了精確的代碼,它工作正常,沒有錯誤。最初,它是從Linux(ubuntu 16)運行發佈的,現在是Windows 7的運行版本。 Linux使用熊貓20/Windows熊貓19,都是Python 3.4。 – Parfait