Python XPath 包含缺少的元素
Python XPath include missing elements
<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 方法但无法使其工作(该列表仍将只包含存在的元素)。
我会使用 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!', '']
<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 方法但无法使其工作(该列表仍将只包含存在的元素)。
我会使用 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!', '']