XML(Extensible Markup Language)是另外一种常见的支持分层、嵌套数据以及元数据的结构化数据格式。本书所使用的这些文件实际上来自于一个很大的XML文档。html
纽约大都会运输署(Metropolitan Transportation Authority,MTA)发布了一些有关其公交和列车服务的数据资料(http://www.mta.info/developers/download.html )。这里,咱们将看看包含在一组XML文件中的运行状况数据。每项列车或公交服务都各有各自的文件(如Metro-North Railroad的文件是Performance_MNR.xml),其中每条XML记录就是一条月度数据。这里须要注意,前文所述的网址和文件都已经有了些许变化,下面的文本展现,实际是“./Performance_MNRR.xml”文本内容,咱们的后续学习也将基于该文件。python
<?xml version="1.0" encoding="UTF-8" standalone="true"?> -<PERFORMANCE> -<INDICATOR> <INDICATOR_SEQ>28345</INDICATOR_SEQ> <PARENT_SEQ>55526</PARENT_SEQ> <AGENCY_NAME>Metro-North Railroad</AGENCY_NAME> <INDICATOR_NAME>Hudson Line - OTP</INDICATOR_NAME> <DESCRIPTION>Percent of commuter trains that arrive at their destinations within 5 minutes and 59 seconds of the scheduled time.</DESCRIPTION> <CATEGORY>Service Indicators</CATEGORY> <FREQUENCY>M</FREQUENCY> <DESIRED_CHANGE>U</DESIRED_CHANGE> <INDICATOR_UNIT>%</INDICATOR_UNIT> <DECIMAL_PLACES>1</DECIMAL_PLACES> -<YEAR> <PERIOD_YEAR>2008</PERIOD_YEAR> -<MONTH> <PERIOD_MONTH>1</PERIOD_MONTH> -<MONTHLYVALUES> <YTD_TARGET>98.00</YTD_TARGET> <YTD_ACTUAL>99.30</YTD_ACTUAL> <MONTHLY_TARGET>98.00</MONTHLY_TARGET> <MONTHLY_ACTUAL>99.30</MONTHLY_ACTUAL>
利用lxml.objectify解析文件,经过getroot获得XML文件的根节点的引用:app
from lxml import objectify import numpy as np import pandas as pd from pandas import Series, DataFrame path="Performance_MNRR.xml" parsed = objectify.parse(open(path)) root = parsed.getroot()
root.INDICATOR返回一个用于产生各个
data = [] skip_fields = ['PARENT_SEQ','INDICATOR_SEQ','DESIRED_CHANGE','DECIMAL_PLACES'] for elt in root.INDICATOR: #还能够试试root.INDICATOR.YEAR.PERIOD_YEAR el_data = {} for child in elt.getchildren(): if child.tag in skip_fields: continue el_data[child.tag] = child.text #原child.pyval 没法识别。搜索后建议用.text,但结果perf中都是object类型,而非value data.append(el_data) #好比:GENCY_NAME 13 non-null object
最后,将这组字典转换为一个DataFrame:code
perf = DataFrame(data)
perf.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 13 entries, 0 to 12 Data columns (total 7 columns): AGENCY_NAME 13 non-null object CATEGORY 13 non-null object DESCRIPTION 13 non-null object FREQUENCY 13 non-null object INDICATOR_NAME 13 non-null object INDICATOR_UNIT 13 non-null object YEAR 0 non-null object dtypes: object(7) memory usage: 808.0+ bytes
XML数据能够比本例复杂得多。每一个标记均可以有元数据。看看下面这个HTML的连接标记(它也算是一段有效的XML):orm
from io import StringIO tag = '<a href="http://www.baidu.com">BaiDu</a>' root = objectify.parse(StringIO(tag)).getroot()
如今能够访问连接文本或标记中的任何字段了(如href):xml
root
<Element a at 0x137f2861e88>
root.get('href')
'http://www.baidu.com'
root.text
'BaiDu'
本段中涉及一些概念,还须要后续好好研习,root、children、tag、xml的规范。。。htm