LXML и циклы для создания XML RSS в Python

Я использую 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 ответа

Решение
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)

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

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


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

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

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

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

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

Другие вопросы по тегам