【问题标题】:Best way to Parse XML解析 XML 的最佳方法
【发布时间】:2018-01-17 22:32:45
【问题描述】:

我正在处理一个可用的 xml 文件here

我想将 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

稍后,我会使用 pandas for python 来查找最大 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

【问题讨论】:

  • 你尝试过什么吗?
  • 编辑了问题并粘贴了我到目前为止的代码。
  • 有什么错误吗?输出是什么?
  • ******************** 开始 ******************** LON LAT PGA PGV MMI PSA03 PSA10 PSA30 STDPGA URAT SVEL ******************** 结束 ***************** ***
  • 我不知道如何输出到 csv 文件并解析空格分隔符格式的 grid_data

标签: python pandas csv xml-parsing


【解决方案1】:

考虑使用内置的etree 简单地解析grid_data 节点,然后使用StringIO() 将其直接传递给pandas.read_table

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

【讨论】:

  • 感谢@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 must be unicode or None, not str
  • 我做了这个更改,它确实有效data = unicode(doc.find('.//{http://earthquake.usgs.gov/eqcenter/shakemap}grid_data').text) 在 URAT 值之后,我的输出仍然会得到 '\',我的意思是 SVEL 值跳转到新行。你你我应该怎么做才能把所有东西放在同一条线上?谢谢。
  • 您正在运行什么 pandas 和 python 版本和操作系统?检查print(pd.__version__) 我刚刚在此解决方案中复制并粘贴了确切的代码,它工作正常,没有错误。最初,它是从 Linux (ubuntu 16) 运行和现在的 Windows 7 运行发布的。 Linux 使用 pandas 20/Windows pandas 19,都是 python 3.4。
  • 我在 Windows 7 Enterprise SP1 64 位机器上运行 Pandas v0.20.2 和 Python v2.7.5。
  • 嗯...这一定是 2.7 的问题。您是在使用此代码还是其他 url 请求对象和 xml 解析器? docdata 是否为空?也许试试BytesIO(data)from io import BytesIO
猜你喜欢
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2014-09-02
  • 2015-08-21
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多