首页 > 解决方案 > 我无法使用 nsmap 为 lxml 库添加标签

问题描述

我编写了一个函数来使用 lxml 库生成 Google Merchant RSS Feed

我有以下代码被缩短为单个标签:


from lxml import etree

def generate_xml(self):
    nsmap = {
        "g": "http://base.google.com/ns/1.0",
    }
    page = etree.Element('rss', nsmap=nsmap)
    channel = etree.SubElement(page, 'channel')
    channel_title = etree.SubElement(channel, 'title')
    channel_title.text = "Test RSS 2.0 data feed template products"
    channel_description = etree.SubElement(channel, 'description')
    channel_description.text = "test data feed template."
    channel_link = etree.SubElement(channel, 'link')
    channel_link.text = "https://test-abcd.com"
    item = etree.SubElement(channel, "item")
    item_id = etree.SubElement(item, "id", nsmap=nsmap)
    item_id.text = "123456789"
    return etree.tostring(page, xml_declaration=True, encoding="utf-8")

该函数返回以下输出:


<?xml version='1.0' encoding='utf-8'?>
    <rss xmlns:g="http://base.google.com/ns/1.0">
        <channel>
            <title>Test RSS 2.0 data feed template products</title>
            <description>test data feed template.</description>
            <link>https://test-abcd.com</link>
            <item>
                <id>123456789</id>
            </item>
        </channel>
    </rss>

但它应该如下(<g:id>123456789</g:id>):


<?xml version='1.0' encoding='utf-8'?>
    <rss xmlns:g="http://base.google.com/ns/1.0">
        <channel>
            <title>Test RSS 2.0 data feed template products</title>
            <description>test data feed template.</description>
            <link>https://test-abcd.com</link>
            <item>
                <g:id>123456789</g:id>
            </item>
        </channel>
    </rss>

标签: lxmlelementtree

解决方案


我找到了etree.QName()用于构建合格名称的解决方案id

def generate_xml(self):
    nsmap = {
        "g": "http://base.google.com/ns/1.0",
    }
    page = etree.Element('rss', nsmap=nsmap)
    channel = etree.SubElement(page, 'channel')
    channel_title = etree.SubElement(channel, 'title')
    channel_title.text = "Test RSS 2.0 data feed template products"
    channel_description = etree.SubElement(channel, 'description')
    channel_description.text = "test data feed template."
    channel_link = etree.SubElement(channel, 'link')
    channel_link.text = "https://test-abcd.com"
    item = etree.SubElement(channel, "item")
    item_id = etree.SubElement(item, etree.QName(nsmap.get("g"), 'id'))
    item_id.text = "123456789"

    return etree.tostring(page, xml_declaration=True, encoding="utf-8")


推荐阅读