最佳实践 - 解析 XML API 响应 - Python 3
Best practices - Parsing XML API response - Python 3
我已经参考了几个指南,但我仍然觉得很难理解这个问题(Python newb):
- /docs.python.org/3.7/library/xml.etree.elementtree.html
- /effbot.org/zone/element-xpath.htm
目的是检索邮政编码文本值;但是,我之前和参考指南时都没有这样做,我想要以下 xpath 的输出:
/SearchResults:searchresults[@xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance"]/response/results/result/address/zipcode/text()
这是一个从本地文件运行的示例:
from xml.etree import ElementTree as ET
tree = ET.parse(<destination_of_xml>.xml')
for elem in tree.iterfind('/response/results/result/address/zipcode'):
print(elem.tag, elem.text)
----------------------------------------------------------------------
output:
zipcode {90292}
zipcode {90292}
...
在这种情况下,检索邮政编码值并说明未来任何模式更改的最佳做法是什么(即遍历 XML 直到找到元素邮政编码)?有更好的解决方案吗?
您可能需要了解 xpath 表达式。
我正在使用 lxml 库来解析更简单的 xml 层次结构。我不需要知道 zipcode
元素上面的内容,因为我可以编写一个 xpath 表达式,实际上,从文档顶部的任何地方查找 zipcode
元素(注意,复数): .//zipcode
。这产生了元素。现在我有了它们,因为我知道只有一个,我 select 'first',得到它的 text
并去掉前导和尾随的空白。
前提是元素名称不变...
>>> from xml.etree import ElementTree as ET
>>> from lxml import etree
>>> tree = etree.fromstring('''\
... <company>
... <name>XYZ</name>
... <industry>chemicals</industry>
... <address>
... <street>
... 14234 Onyx Drive West
... </street>
... <city>
... Ainslie
... </city>
... <state>
... Idaho
... </state>
... <zipcode>
... 87734
... </zipcode>
... </address>
... </company>''')
>>> tree.xpath('.//zipcode')
[<Element zipcode at 0xb5e9c8>]
>>> tree.xpath('.//zipcode')[0].text.strip()
'87734'
我已经参考了几个指南,但我仍然觉得很难理解这个问题(Python newb):
- /docs.python.org/3.7/library/xml.etree.elementtree.html
- /effbot.org/zone/element-xpath.htm
目的是检索邮政编码文本值;但是,我之前和参考指南时都没有这样做,我想要以下 xpath 的输出:
/SearchResults:searchresults[@xmlns:xsi="http://www.w3.org/2001/XMLSchema-
instance"]/response/results/result/address/zipcode/text()
这是一个从本地文件运行的示例:
from xml.etree import ElementTree as ET
tree = ET.parse(<destination_of_xml>.xml')
for elem in tree.iterfind('/response/results/result/address/zipcode'):
print(elem.tag, elem.text)
----------------------------------------------------------------------
output:
zipcode {90292}
zipcode {90292}
...
在这种情况下,检索邮政编码值并说明未来任何模式更改的最佳做法是什么(即遍历 XML 直到找到元素邮政编码)?有更好的解决方案吗?
您可能需要了解 xpath 表达式。
我正在使用 lxml 库来解析更简单的 xml 层次结构。我不需要知道 zipcode
元素上面的内容,因为我可以编写一个 xpath 表达式,实际上,从文档顶部的任何地方查找 zipcode
元素(注意,复数): .//zipcode
。这产生了元素。现在我有了它们,因为我知道只有一个,我 select 'first',得到它的 text
并去掉前导和尾随的空白。
前提是元素名称不变...
>>> from xml.etree import ElementTree as ET
>>> from lxml import etree
>>> tree = etree.fromstring('''\
... <company>
... <name>XYZ</name>
... <industry>chemicals</industry>
... <address>
... <street>
... 14234 Onyx Drive West
... </street>
... <city>
... Ainslie
... </city>
... <state>
... Idaho
... </state>
... <zipcode>
... 87734
... </zipcode>
... </address>
... </company>''')
>>> tree.xpath('.//zipcode')
[<Element zipcode at 0xb5e9c8>]
>>> tree.xpath('.//zipcode')[0].text.strip()
'87734'