<tree>
<item>
<element1>somedata</element1>
<element2>moredata</element2>
<element3>data?</element3>
<optional_element>data!</optional_element>
</item>
<item>
<element1>somedata</element1>
<element2>moredata</element2>
<element3>data?</element3>
</item>
<item>
<element1>somedata</element1>
<element2>moredata</element2>
<element3>data?</element3>
<optional_element>data!</optional_element>
</item>
<item>
<element1>somedata</element1>
<element2>moredata</element2>
<element3>data?</element3>
</item>
</tree>
我有一个像这样的XML文档,我想要实现的是获得这种输出:
["data!", "", "data!", ""]
而非["data!", "data!"]
到目前为止,我已尝试this方法而无法使其工作(列表仍然只包含存在的元素)。
答案 0 :(得分:3)
我会使用findtext()
并指定default
:
[item.findtext("optional_element", default="") for item in tree.findall("item")]
演示(使用lxml
):
>>> from lxml import etree
>>>
>>> data = """<?xml version="1.0" encoding="utf-8"?>
... <tree>
... <item>
... <element1>somedata</element1>
... <element2>moredata</element2>
... <element3>data?</element3>
... <optional_element>data!</optional_element>
... </item>
... <item>
... <element1>somedata</element1>
... <element2>moredata</element2>
... <element3>data?</element3>
... </item>
... <item>
... <element1>somedata</element1>
... <element2>moredata</element2>
... <element3>data?</element3>
... <optional_element>data!</optional_element>
... </item>
... <item>
... <element1>somedata</element1>
... <element2>moredata</element2>
... <element3>data?</element3>
... </item>
... </tree>
... """
>>>
>>> tree = etree.fromstring(data)
>>> print [item.findtext("optional_element", default="") for item in tree.findall("item")]
['data!', '', 'data!', '']