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
элемент.