LXML и циклы для создания XML RSS в Python - PullRequest
2 голосов
/ 20 января 2010

Я использую lxml для создания XML-канала RSS. Но у меня возникли проблемы с тегами, и я не могу понять, как добавить динамическое количество элементов. Учитывая, что 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 голосов
/ 21 января 2010

Джейсон ответил на ваш вопрос; но - только для справки - вы можете динамически передавать любое количество аргументов функции в виде списка: E.channel(*args), где args будет [E.title( ... ), E.link( ... ), ... ]. Аналогично, аргументы ключевых слов можно передать с помощью dict и двух звездочек (**). См. документацию .

4 голосов
/ 21 января 2010

Этот учебник lxml говорит:


Чтобы создать дочерние элементы и добавить их в родительский элемент, вы можете использовать метод append():

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

Однако это так часто встречается, что есть более короткий и гораздо более эффективный способ сделать это: фабрика SubElement. Он принимает те же аргументы, что и фабрика Element, но дополнительно требует родителя в качестве первого аргумента:

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

Таким образом, вы сможете создать документ, затем сказать channel = rss.find("channel") и использовать любой из вышеперечисленных методов для добавления дополнительных элементов к элементу channel.

2 голосов
/ 21 января 2010
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)
...