2010-01-20 6 views
2

J'ai utilisé lxml pour créer le XML du flux rss. Mais j'ai des problèmes avec les tags et je n'arrive pas vraiment à comprendre comment ajouter un nombre dynamique d'éléments. Étant donné que lxml semble avoir juste des fonctions comme paramètres de fonctions, je ne peux pas sembler comprendre comment faire une boucle pour un nombre dynamique d'éléments sans refaire la page entière.lxml et les boucles pour créer xml rss en python

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"), 
      ), 
     ) 
    ) 
    ) 

Répondre

2
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) 
4

This lxml tutorial dit:


Pour créer des éléments enfants et les ajouter à un élément parent, vous pouvez utiliser la méthode append():

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

Cependant, cela est si commun Il existe un moyen plus court et beaucoup plus efficace de le faire: l'usine SubElement. Il accepte les mêmes arguments que l'usine Element, mais exige en outre le parent comme premier argument:

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

Donc, vous devriez être en mesure de créer le document, puis dire channel = rss.find("channel") et utiliser l'une des méthodes ci-dessus pour ajouter plus d'éléments à l'élément channel.

5

Jason a répondu à votre question; mais - juste FYI - vous pouvez passer n'importe quel nombre d'arguments de fonction dynamiquement comme une liste: E.channel(*args), où args serait [E.title( ... ), E.link( ... ), ... ]. De même, les arguments de mot-clé peuvent être passés en utilisant dict et deux étoiles (**). Voir documentation.

Questions connexes