1

長いxmlドキュメントから、いくつかの属性を取得しようとしています。具体的には、このコードが確実に達成するステージのcfsおよびftレベルを取得しようとしています。難しいのは、次のようなタグからタイムスタンプを日時値として抽出する方法がわからないように見えることです。

<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
4

2 に答える 2

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')
于 2012-11-02T01:35:31.067 に答える
0

ElementTreeのiter()メソッドは、次のように、必要なデータの一部を取得するのにも便利です。いくつかの出力例はプログラムに従います。

#!/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

ns1:(注:プレフィックスとを正しく処理する方法がわからないns2:ため、上記では、を介してプレフィックスを抑制していre.subます。データは、コードを保持する代わりに、上記のデモコードの簡潔さのためにファイルから取得されましたurllib2。また、以前の回答のように、タイムゾーンは処理されません。)以下の出力例は、質問からのリンクにあるXMLデータファイルに基づいて おり、ローカルファイルとして保存されていますwaterservices.usgs.gov.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))
于 2012-11-02T08:15:42.153 に答える