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。这似乎是最简单的解决方案。
这是我尝试解析的结构。
我对 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。这似乎是最简单的解决方案。