使用lxml和循环在Python中创建XML RSS

4 投票
3 回答
2352 浏览
提问于 2025-04-15 18:16

我一直在用lxml来创建RSS订阅的XML文件。但是我在处理标签时遇到了问题,搞不清楚怎么添加动态数量的元素。因为lxml似乎只是把函数当作其他函数的参数,所以我不知道怎么在不重做整个页面的情况下,循环添加动态数量的项目。

rss = page = (
      E.rss(
        E.channel(
          E.title("Page Title"),
   E.link(""),
   E.description(""),

            E.item(
                  E.title("Hello!!!!!!!!!!!!!!!!!!!!! "),
                  E.link("htt://"),
                  E.description("this is a"),
            ),
        )
      )
    )

3 个回答

5

这个lxml教程提到:


要创建子元素并把它们添加到父元素中,你可以使用 append() 方法:

>>> root.append( etree.Element("child1") )

不过,这种做法很常见,所以有一种更简单、更高效的方法:使用 SubElement 工厂。它接受和 Element 工厂一样的参数,但需要把父元素作为第一个参数:

>>> child2 = etree.SubElement(root, "child2")
>>> child3 = etree.SubElement(root, "child3")

所以你应该能够创建文档,然后使用 channel = rss.find("channel") 来找到频道,并用上面提到的任意一种方法来向 channel 元素添加更多的项目。

6

Jason已经回答了你的问题;不过顺便说一下,你可以动态地传递任意数量的函数参数,方法是把它们放在一个列表里,比如说:E.channel(*args),这里的args可以是[E.title(...), E.link(...),...]。同样,你也可以用字典和两个星号(**)来传递关键字参数。具体可以参考文档

3
channel = E.channel(E.title("Page Title"), E.link(""),E.description(""))
    for (title, link, description) in container:
        try:
                    mytitle = E.title(title)
                    mylink = E.link(link)
                    mydesc = E.description(description)
            item = E.item(mytitle, mylink, mydesc)
                except ValueError:
                    print repr(title)
                    print repr(link)
                    print repr(description)
                    raise
        channel.append(item)
    top = page = E.top(channel)

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。

撰写回答