2010-07-04 3 views
0

У меня есть XML-файл со структурой, как показано ниже:XPath и LXML синтаксис

<x> 
    <y/> 
    <y/> 
    . 
    . 
</x> 

Количество <y> тегов произвольны.

Я хочу получить текст тегов <y>, и для этого я решил использовать XPath. Я понял, синтаксис, скажем, для первого y: (Предположим, что root как x)

textFirst = root.xpath('y[1]/text()')

Это работает, как ожидалось.

Однако моя проблема заключается в том, что я не буду знать число <y> тегов заранее, так, чтобы исправить это, я сделал это:

>>> count = 0 
>>> for number in root.getiterator('y'): 
...  count += 1 

Так что теперь я знаю, что есть count количество y в x. (Есть ли лучший способ получить количество тегов Если да, пожалуйста, предложите?)

Однако, если я делаю это:

>>> def try_it(x): 
...  return root.xpath('y[x]/text()') 
... 
>>> try_it(1) 
[] 

возвращает пустой список.

Так что мой вопрос: не знать произвольное количество тегов, как получить синтаксис или выражение XPath для него и использовать lxml?

Извините, если что-то неясно, я постарался изо всех сил, чтобы объяснить проблему.

ответ

1

что относительно 'y[%i]/text()' % x?

сейчас вы видите, где вы совершили ошибку? :)

(.. обратите внимание, что вы можете захватить все элементы Y вместе с XPath 'y' или '//y')

+0

Ohhhhhhh! Оно работает! Огромное спасибо. Очень глупо от меня. Является ли мой метод получения числа 'y' тегов ОК или есть более короткая версия? – user225312

+0

PulpFiction: это случается :) Я обновил ответ с подсказкой на более простом способе, как это сделать проще – mykhal

+0

mykhal: Спасибо за помощь, вы спасли мне много хлопот. Хорошего дня! :) – user225312

1

Для подсчета количества y узлов, вы можете использовать выражение XPath 'count(/x/y)'.

Кроме того, я думаю, что проблема с вашим выражением в функции try_it заключается в том, что вы используете литеральное значение x вместо конкатенации входного параметра в выражение XPath.

Может быть что-то, как это будет работать:

>>> def try_it(x): 
...  return root.xpath('y[' + x + ']/text()') 

Надеется, что это помогает!

+0

count() был именно тем, что мне нужно. Спасибо за ваш ответ. – user225312

+0

Почему count() возвращает float? – user225312

+0

@PulpFiction - 'lxml' возвращает float для любого выражения XPath, которое возвращает числовой результат (в Java соответствующий результат -« Double »). Вы должны просто угаснуть его. – mlschechter

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