代码之家  ›  专栏  ›  技术社区  ›  Recursion

在python中创建XML RSS的lxml和循环

  •  2
  • Recursion  · 技术社区  · 15 年前

    我一直在使用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 回复  |  直到 15 年前
        1
  •  5
  •   Messa    15 年前

    Jason已经回答了你的问题;但是“仅供参考”,你可以动态地将任意数量的函数参数作为一个列表传递: E.channel(*args) 在哪里 args 将是 [E.title( ), E.link( ), ] . 类似地,关键字参数可以使用dict和两个星来传递( ** )见 documentation .

        2
  •  4
  •   Jason Orendorff Oliver    15 年前

    This lxml tutorial 说:


    要创建子元素并将其添加到父元素,可以使用 append() 方法:

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

    然而,这是很常见的,因此有一种更短、更有效的方法来做到这一点:即 SubElement 工厂。它接受与 Element 工厂,但还需要父级作为第一个参数:

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

    所以你应该能够创建文档,然后说 channel = rss.find("channel") 并使用上述任何一种方法向 channel 元素。

        3
  •  2
  •   Recursion    15 年前
    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)