2012-11-02 2 views
1

long xml document에서 나는 몇 가지 특성을 얻으려고합니다. 특히 나는이 코드가 안정적으로 수행하는 무대 cfs 및 ft 레벨을 얻으려고합니다. 어려움은 내가 유사한 태그에서 날짜 값으로 타임 스탬프를 추출하는 방법을 알아낼 수없는 것입니다 : 개선을위한이 xml 태그에서 시간을 얻으려면 어떻게해야합니까?

<ns1:value qualifiers="P" dateTime="2012-11-01T18:45:00.000-05:00">54800</ns1:value> 

어떤 도움과 제안은 크게 감사하고 있습니다.

def getLevels(gaugeId): 

    # create url string 00060=cfs and 00065=ft 
    urlRoot = "http://waterservices.usgs.gov/nwis/iv/?format=waterml,1.1&sites=" 
    urlTail = "&parameterCd=00060,00065" 
    url = urlRoot + str(gaugeId) + urlTail 
    del urlRoot, urlTail 

    # open connection to url 
    urlFile = urllib2.urlopen(url) 

    # convert urlFile to string data: 
    urlData = urlFile.read() 

    # close file to release memory 
    urlFile.close() 

    # parse downloaded xml 
    domData = parseString(urlData) 

    # extract xml element values for stage cfs and ft 
    index = 0 
    elementCount = domData.getElementsByTagName("ns1:value").length 
    output = [] 
    while elementCount >= index: 
     xmlString = domData.getElementsByTagName("ns1:value")[index].toxml() 
     output.append(stripXmlTags(xmlString)) 
     index = index + 1 

    # extract and return 
    return output 

답변

0

ITER 국제() ElementTree의 방법은 또한의 일부를 얻기를위한 편리 원하는 데이터를 선택하십시오. 일부 예제 출력은 프로그램 다음에 나옵니다.

#!/usr/bin/env python 
from xml.etree import cElementTree as ET 
from datetime import datetime 
import re 

with open('waterservices.usgs.gov.xml','r') as fi: 
    waterData = ''.join(fi.readlines()) 
waterData = re.sub('ns[12]:', '', waterData) 
root = ET.fromstring(waterData) 
dates = [v.get('dateTime') for v in root.iter('value')] 
valus = [float(v.text) for v in root.iter('value')] 
units = [v.text for v in root.iter('variableName')] 
print 'valus', valus 
print 'units', units 
print 'dates', dates 
dates = [datetime.strptime(t[:-6], '%Y-%m-%dT%H:%M:%S.%f') for t in dates] 
print 'dates', dates 
a = zip (valus, units, dates) 
for v in a: 
    print v 

(참고, 위가 re.sub를 통해이를 억제 한 그렇게 올바르게, 접두사 ns1:ns2:을 처리하는 방법을 모르겠어요. 데이터는 위의 데모 코드 대신에 간결 파일에서 찍은 urllib2 코드를 유지하고 이전 답변과 마찬가지로 시간대가 처리되지 않습니다. 아래의 예제 출력은 로컬 데이터 파일 waterservices.usgs.gov.xml으로 저장된 link from question의 XML 데이터 파일을 기반으로합니다.

valus [53200.0, 6.86] 
units ['Streamflow, ft&#179;/s', 'Gage height, ft'] 
dates ['2012-11-01T19:45:00.000-05:00', '2012-11-01T19:45:00.000-05:00'] 
dates [datetime.datetime(2012, 11, 1, 19, 45), datetime.datetime(2012, 11, 1, 19, 45)] 
(53200.0, 'Streamflow, ft&#179;/s', datetime.datetime(2012, 11, 1, 19, 45)) 
(6.86, 'Gage height, ft', datetime.datetime(2012, 11, 1, 19, 45)) 
0
당신은 시작 지점으로 사용할 수 있습니다

-이 현재 시간대를 무시주의 ...

from xml.etree import ElementTree as ET 

tree = ET.fromstring(urlData) 
for elem in tree.findall('.//{http://www.cuahsi.org/waterML/1.1/}value'): 
    print datetime.strptime(elem.attrib['dateTime'][:-10], '%Y-%m-%dT%H:%M:%S') 
관련 문제