2013-03-28 2 views
2

[N.B. Я довольно новичок в Python & Xpath]Используйте переменную для запроса Xpath в Python

Я хотел выполнить запрос Xpath и использовать переменную в выражении для циклического перехода по всем элементам с помощью индекса.

Например, вместо того, чтобы иметь конкретное положение [1], [2] и т.д., я хотел бы, чтобы иметь возможность поместить переменную i в этом выражении:

for x in root.xpath('/movies/a_movie[i]/studio'): 
    print "<studio>" + x.text + "</studio>" 

Я не уверен, является ли это даже возможно, но я думаю, это не может помешать спросить!

Чтобы уточнить, вот почему я хотел бы сделать это: я пытаюсь обработать все элементы a_movie[1], а затем в конце функции хочу обработать все элементы a_movie[2] и т. Д. ,

+0

Просто оставьте outh '[я]' вообще? Вы выбираете элементы 'studio', которые находятся внутри элемента' a_movie', вы * уже * будете перебирать все совпадения. –

+0

@MartijnPieters У меня это было изначально, но это не соответствовало моим потребностям - я пытаюсь для обработки всех элементов 'a_movie [1]', а затем в конце функции я хотел обработать все элементы 'a_movie [2]'. – Daniel

ответ

1

Вы хотите петлю над /movies/a_movie теги вместо этого, но только те, которые имеютstudio ребенок:

for a_movie in root.xpath('/movies/a_movie[studio]'): 
    name = a_movie.find('name').text 
    studio = a_movie.find('studio') 
    print "<studio>" + studio.text + "</studio>" 

Если вы хотите, чтобы просто распечатать дочерние элементы a_movie элемента как XML, я бы просто петля над элементом (обхват над дочерними элементами) и использовать ElementTree.tostring() по каждому:

for a_movie in root.xpath('/movies/a_movie'): 
    for elem in a_movie: 
     print ElementTree.tostring(elem), 
+0

Спасибо, Martijn. Однако это все еще приводит к проблеме, о которой я упоминал ранее; когда я запускаю свой скрипт, он печатает все дочерние имена подряд - например. он сразу же распечатывал все имена студий каждого из элементов 'a_movie' в XML-файле. Я хочу, чтобы он печатал имена детей 'a_movie [1]', затем все имена детей 'a_movie [2]', затем 'a_movie [3]' ... Причина, по которой я хотел бы сделать это состоит в том, чтобы использовать один и тот же блок кода для обработки каждого из элементов 'a_movie'. – Daniel

+0

@ Daniel: Это происходит по методу 'a_movie' в порядке. Если в каждом теге 'a_movie' есть несколько тегов' ', то также перебирайте их. Вы не включили образец вашего входного XML, поэтому я должен угадать, что вы имеете в виду здесь. –

+0

Вот вход XML: http://cl.ly/code/2N3F1g3L2W0V Я надеюсь, что это поможет уточнить ... – Daniel

Смежные вопросы