**目标:获取<Name>
标记中的值并将其打印出来。 下面是简化的XML。
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<GetStartEndPointResponse xmlns="http://www.etis.fskab.se/v1.0/ETISws">
<GetStartEndPointResult>
<Code>0</Code>
<Message />
<StartPoints>
<Point>
<Id>545</Id>
<Name>Get Me</Name>
<Type>sometype</Type>
<X>333</X>
<Y>222</Y>
</Point>
<Point>
<Id>634</Id>
<Name>Get me too</Name>
<Type>sometype</Type>
<X>555</X>
<Y>777</Y>
</Point>
</StartPoints>
</GetStartEndPointResult>
</GetStartEndPointResponse>
</soap:Body>
</soap:Envelope>
尝试次数:
import requests
from xml.etree import ElementTree
response = requests.get('http://www.labs.skanetrafiken.se/v2.2/querystation.asp?inpPointfr=yst')
# XML parsing here
dom = ElementTree.fromstring(response.text)
names = dom.findall('*/Name')
for name in names:
print(name.text)
我读过其他人推荐zeep
来解析soapxml,但我发现很难理解。
5条答案
按热度按时间nnvyjq4y1#
这里的问题是如何处理XML名称空间:
命名空间分别来自
Envelope
和GetStartEndPointResponse
节点上的xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
和xmlns="http://www.etis.fskab.se/v1.0/ETISws"
属性。请记住,父节点的所有子节点都会继承名称空间,即使子节点的标签上未明确指定名称空间为
<namespace:tag>
。注意:我不得不使用
response.content
而不是response.body
。wmvff8tz2#
一个老问题,但值得一提的是,这一任务的另一个选择。
我喜欢使用
xmltodict
(Github)一个XML
到python字典的轻量级转换器。在名为
stack
的变量中获取soap响应使用
xmltodict.parse
解析它检查结果:
此时,就像浏览Python字典一样简单
fnvucqvd3#
再次回答一个老问题,但我认为这个解决方案值得分享。使用BeautifulSoup对我来说是小菜一碟。你可以从here安装BeautifulSoup。
sigwle7e4#
只需将所有'soap:'和其他命名空间前缀(如'a:')替换为''(只需删除它们并使其成为非SOAP xml文件)
new_response = response.text.replace('soap:', '').replace('a:', '')
然后你就可以正常进行了。
6psbrbz95#
这样试试