XPath 和 lxml 语法

0 投票
2 回答
1799 浏览
提问于 2025-04-16 00:48

我有一个XML文件,结构如下:

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

里面的<y>标签数量是随意的。

我想提取<y>标签中的文本,所以我决定使用XPath来实现。我已经搞清楚了语法,比如说对于第一个y标签:(假设rootx

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

这个方法效果很好。

不过我的问题是,我事先不知道<y>标签的数量,所以我做了这个:

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

这样我就知道在x中有county标签。(有没有更好的方法来获取标签的数量?如果有,请告诉我)

但是,如果我这样做:

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

它返回的是一个空列表。

所以我的问题是:在不知道标签数量的情况下,如何用XPath语法或表达式来获取它,并且使用lxml

如果有什么不清楚的地方,我很抱歉,我尽量解释清楚了这个问题。

2 个回答

1

要计算 y 节点的数量,你可以使用这个 XPath 表达式 'count(/x/y)'

另外,我觉得你在 try_it 函数里的表达式有问题,因为你似乎直接用了字面值 x,而不是把输入的参数拼接到 XPath 表达式里。

也许像这样就能奏效:

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

希望这能帮到你!

1

'y[%i]/text()' % x 呢?

现在你看到你哪里出错了吗? :)

( .. 注意,你可以用 xpath 'y''//y' 一次性抓取所有的 y 元素 )

撰写回答