Python解析API返回XML响应获取testId值报错求助
解决XML提取testId时的AttributeError问题
Hey,我来帮你搞定这个问题!你碰到的AttributeError: 'NoneType' object has no attribute 'text',核心原因是代码里直接调用find("testId")找不到目标节点——因为testId并非根节点的直接子元素,它嵌套在<data>节点内部呢!
先看你获取到的XML结构:
<?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>
很明显,testId是<data>的子节点,而不是<response>的直接子节点,所以直接用find("testId")会返回None,再调用.text自然就触发错误了。
下面给你两种可行的修正方案:
方案一:用XPath全局查找节点
使用.//testId这种XPath表达式,可以遍历整个XML文档找到匹配的节点,代码修改如下:
import requests from xml.etree import ElementTree as ET # 发起API请求获取XML r = requests.get(f"{myconfig.URL_webpagetest}?url={testurl}&f=xml&k={myconfig.apikey_webpagetest}") xmltxt = r.content print(xmltxt) # 解析XML并查找testId root = ET.XML(xmltxt) testId_elem = root.find(".//testId") if testId_elem: testId = testId_elem.text # 发起状态查询请求 r = requests.get(f"http://www.webpagetest.org/testStatus.php?f=xml&test={testId}") else: print("未能找到testId节点,请检查XML结构")
方案二:逐层定位节点(更严谨)
先找到<data>节点,再从它下面获取testId,这样能明确节点层级,避免意外匹配到其他同名节点:
import requests from xml.etree import ElementTree as ET r = requests.get(f"{myconfig.URL_webpagetest}?url={testurl}&f=xml&k={myconfig.apikey_webpagetest}") xmltxt = r.content print(xmltxt) root = ET.XML(xmltxt) # 先找data节点 data_node = root.find("data") if data_node: testId_elem = data_node.find("testId") if testId_elem: testId = testId_elem.text r = requests.get(f"http://www.webpagetest.org/testStatus.php?f=xml&test={testId}") else: print("data节点下未找到testId") else: print("XML中未找到data节点")
另外提醒一句:你代码里的XML(xmltxt)应该是ET.XML(xmltxt)吧?记得要先导入xml.etree.ElementTree模块,不然会出现未定义的错误哦。
内容的提问来源于stack exchange,提问作者Bhupendra Singh Rautela
相关产品推荐
相关产品推荐

