Python - How to parse xml response and store a elements value in a variable?

27,185

Solution 1

Use the following to collect testId from response:-

import xml.etree.ElementTree as ET

response_xml_as_string = "xml response string from API"
responseXml = ET.fromstring(response_xml_as_string)
testId = responseXml.find('data').find('testId')
print testId.text

Solution 2

from lxml.etree import fromstring

string = '<?xml version="1.0" encoding="UTF-8"?> <response> <statusCode>200</statusCode> <statusText>Ok</statusText> <data><testId>180523_YM_054fd7d84fd4ea7aed237f87289e0c7c</testId> <ownerKey>dfc65d98de13c4770e528ef5b65e9629a52595e9</ownerKey> <jsonUrl>http://www.webpagetest.org/jsonResult.php?test=180523_YM_054fd7d84fd4ea7aed237f87289e0c7c</jsonUrl> </data> </response>'

response = fromstring(string.encode('utf-8'))
elm = response.xpath('/response/data/testId').pop()
testId = elm.text

This way you can search for any element within the xml from the root/parent element via the XPATH.

Side Note: I don't particular like using the pop method to remove the item from a single item list. So if anyone else has a better way to do it please let me know. So far I've consider:

1) elm = next(iter(response.xpath('/response/data/testId')))

2) simply leaving it in a list so it can use as a stararg

Share:
27,185
Bhupendra Singh Rautela
Author by

Bhupendra Singh Rautela

Updated on March 13, 2021

Comments

  • Bhupendra Singh Rautela
    Bhupendra Singh Rautela about 3 years

    I am getting the XML response from the API call.

    I need the "testId" attribute value from this response. Please help me on this.

    r = requests.get( myconfig.URL_webpagetest + "?url=" + testurl + "&f=xml&k=" + myconfig.apikey_webpagetest )
    xmltxt = r.content
    print(xmltxt)
    testId = XML(xmltxt).find("testId").text
    r = requests.get("http://www.webpagetest.org/testStatus.php?f=xml&test=" + testId )
    

    xml response:

    screenshot of xml response

    <?xml version="1.0" encoding="UTF-8"?>
    <response>
        <statusCode>200</statusCode>
        <statusText>Ok</statusText>
        <data>
            <testId>180523_YM_054fd7d84fd4ea7aed237f87289e0c7c</testId>
            <ownerKey>dfc65d98de13c4770e528ef5b65e9629a52595e9</ownerKey>
            <jsonUrl>http://www.webpagetest.org/jsonResult.php?test=180523_YM_054fd7d84fd4ea7aed237f87289e0c7c</jsonUrl>
        </data>
    </response>
    

    The following error is produced:

    Traceback (most recent call last):
      File "/pagePerformance.py", line 52, in <module>
        testId = XML (xmltxt).find("testId").text
    AttributeError: 'NoneType' object has no attribute 'text'
    
    • nandal
      nandal almost 6 years
      can you post the xml response of the API call?
    • Bhupendra Singh Rautela
      Bhupendra Singh Rautela almost 6 years
      updated the question, please help.
    • Rakesh
      Rakesh almost 6 years
      Can you post the xml string in the question? and not the image