如何使用 lxml 创建命名空间元素?
How do I create a namespaced element with lxml?
我正在使用 lxml 生成最终用作播客的 RSS 提要。这意味着我需要添加命名空间元素,例如 <itunes:duration>
和 <itunes:subtitle>
。但是我在尝试弄清楚如何使用 lxml 动态创建这些元素时遇到了很多麻烦。
如果我只是尝试:
from lxml import etree
element = etree.Element("itunes:duration")
我明白了:
ValueError: Invalid tag name 'itunes:duration'
接下来我尝试了这个并靠近了一点:
from lxml import etree
etree.register_namespace("itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd")
element = etree.Element("{itunes}duration")
print(etree.tostring(element).decode("utf-8"))
然而这导致了这个输出:
<ns0:duration xmlns:ns0="itunes"/>
所以虽然这比例外要好,但显然仍然不对。如何创建标签名称中带有 itunes:
前缀的元素?
尝试使用 etree.QName()
...
from lxml import etree
etree.register_namespace("itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd")
element = etree.Element(etree.QName("http://www.itunes.com/dtds/podcast-1.0.dtd", "duration"))
print(etree.tostring(element).decode("utf-8"))
打印...
<itunes:duration xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"/>
您也可以只使用 Clark 表示法...
element = etree.Element("{http://www.itunes.com/dtds/podcast-1.0.dtd}duration")
我正在使用 lxml 生成最终用作播客的 RSS 提要。这意味着我需要添加命名空间元素,例如 <itunes:duration>
和 <itunes:subtitle>
。但是我在尝试弄清楚如何使用 lxml 动态创建这些元素时遇到了很多麻烦。
如果我只是尝试:
from lxml import etree
element = etree.Element("itunes:duration")
我明白了:
ValueError: Invalid tag name 'itunes:duration'
接下来我尝试了这个并靠近了一点:
from lxml import etree
etree.register_namespace("itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd")
element = etree.Element("{itunes}duration")
print(etree.tostring(element).decode("utf-8"))
然而这导致了这个输出:
<ns0:duration xmlns:ns0="itunes"/>
所以虽然这比例外要好,但显然仍然不对。如何创建标签名称中带有 itunes:
前缀的元素?
尝试使用 etree.QName()
...
from lxml import etree
etree.register_namespace("itunes", "http://www.itunes.com/dtds/podcast-1.0.dtd")
element = etree.Element(etree.QName("http://www.itunes.com/dtds/podcast-1.0.dtd", "duration"))
print(etree.tostring(element).decode("utf-8"))
打印...
<itunes:duration xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"/>
您也可以只使用 Clark 表示法...
element = etree.Element("{http://www.itunes.com/dtds/podcast-1.0.dtd}duration")