Xpath。如何获取 text() 之后的节点

Xpath. How to get the node following text()

这是我尝试解析的结构。 我对 p 中的每个 child 都有一个 for 循环。我需要在 <sup> 节点中获取名称和关联的编号。 所需的输出将是这样的: 托卢,1; 威廉 C 贝克,2 岁; 等等 这是我的 for 循环:

for b in i.xpath('./p/text() | ./p/b/text()'):
    b.xpath('.//following-sibling::sup[1]/text()').get()

它没有return任何结果。我哪里错了? PS。如果你 运行 xpath 没有 for 循环,它就完成了:

i.xpath('./p[2]/text()/following-sibling::sup/text() | ./p[2]/b/text()/following-sibling::sup/text()').getall()
['2', '1', '1', '1', '2', '1', '1', '1', '2']

考虑列表理解,例如result = [text.xpath('concat(., ": ", following-sibling::sup[1])') for text in i.xpath('./p/text() | ./p/b/text()')]

没有更多细节: link、解析器(html、lmxl...)、抓取器(beautifoulsoup、selenium...)、想要的输出格式(list、dict...),你真的需要“;”吗?作为分隔符?

如果名字的数量 ALWAYS 与号码的数量匹配,那么试试这个:

鉴于您的图片:

from io import StringIO
from lxml import etree

f = StringIO('<p><b>Toloo Taghian</b><sup>1</sup>", Willam C. Baker"<sup>1</sup>", Stephanie Bertrand"<sup>2</sup></p>')
i = etree.parse(f)

然后:

groups = i.xpath('//p')

for el in groups:
  name = el.xpath('.//text()')

结果:

['Toloo Taghian', '1', '", Willam C. Baker"', '1', '", Stephanie Bertrand"', '2']

然后:

name2 = list(zip(name[::2], name[1::2]))

作为元组列表的结果:

[('Toloo Taghian', '1'),
 ('", Willam C. Baker"', '1'),
 ('", Stephanie Bertrand"', '2')]

谢谢你们的帖子,伙计们。 我所做的实际上是解析所有文本节点,然后为每个节点找到第一个 preceding-sibling。这似乎是最简单的解决方案。