从XML/SOAP中提取数据

2024-04-19 15:08:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我下面的代码正在返回:

LNG Stock Level 2016-09-30T14:00:14Z 2016-03-14T00:00:00Z 6722.422335

这就是我想要它做的,但是应该有更多的数据。当我查看api返回的XML数据时,有很多数据点,但是我无法让我的代码全部输出。你知道吗

我试过不缩进打印,但这并不能解决问题。你知道吗

它应该这样做,但不是:

LNG Stock Level 2016-09-30T14:00:14Z 2016-03-14T00:00:00Z 6722.422335
LNG Stock Level 2016-09-30T14:00:14Z 2016-03-14T00:00:00Z 3048.422335
LNG Stock Level 2016-09-30T14:00:14Z 2016-03-14T00:00:00Z 3430.422335

import requests
from lxml import etree
def getXML():

    toDate = "2016-03-16"
    fromDate = "2016-03-14"
    dateType = "gasday"

    url="http://marketinformation.natgrid.co.uk/MIPIws-public/public/publicwebservice.asmx"
    headers = {'content-type': 'application/soap+xml; charset=utf-8'}

    body ="""<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
        <soap12:Body>
            <GetPublicationDataWM xmlns="http://www.NationalGrid.com/MIPI/">
                <reqObject>
                    <LatestFlag>Y</LatestFlag>
                    <ApplicableForFlag>Y</ApplicableForFlag>
                    <ToDate>%s</ToDate>
                    <FromDate>%s</FromDate>
                    <DateType>%s</DateType>
                    <PublicationObjectNameList>
                        <string>LNG Stock Level</string>
                    </PublicationObjectNameList>
                </reqObject>
            </GetPublicationDataWM>
        </soap12:Body>
    </soap12:Envelope>""" % (toDate, fromDate,dateType)

    response = requests.post(url,data=body,headers=headers)
    return response.content  


root = etree.fromstring(getXML())

# map prefix 'd' to the default namespace URI
ns = { 'd': 'http://www.NationalGrid.com/MIPI/'}

publication_objects = root.xpath('//d:CLSMIPIPublicationObjectBE', namespaces=ns)
for obj in publication_objects:
    name = obj.find('d:PublicationObjectName', ns).text
    data = obj.find('d:PublicationObjectData/d:CLSPublicationObjectDataBE', ns)  
    applicable_at = data.find('d:ApplicableAt', ns).text    
    applicable_for = data.find('d:ApplicableFor', ns).text
    value = float(data.find('d:Value', ns).text)
    print(name,applicable_at,applicable_for,value)

Tags: 数据texthttpdatawwwstockfindlevel