lxml 使用xpath,知道xml的兄弟节点的text,如何知道两位一个兄弟的text。谢谢

snakeemail 2020-02-01 08:52:15
xml_string = '''
<root version="1.2" tag="test">
<body>
<items>
<source>aa</source>
<target>AA</target>
</items>
<items>
<source>bb</source>
<target>BB</target>
</items>
</body>
</root>
'''
现在我知道返回结果的构造,我知道tag<source>的text是aa,现在我想知道它的兄弟tag<target>的text。请问怎么用xpath表达?
我用下面的代码获取的是一个空的list

root = etree.fromstring(xml_string) #etree.parse('test.xml')
target = root.xpath('/root/body/items[source=bb]')
print(target)
...全文
201 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰风漫天 2020-02-01
  • 打赏
  • 举报
回复
你的lxml什么版本,我的是4.4.2,contains试了没问题
snakeemail 2020-02-01
  • 打赏
  • 举报
回复
mytree = """ <path> <to> <nodes> <key>1</key> <value>aaaa</value> </nodes> <nodes> <key>2</key> <value>bbbb</value> </nodes> </to> </path> """ from lxml import etree info = etree.XML(mytree) #print info.xpath("/path/to/nodes/info") for x, y in zip( info.xpath("/path/to/nodes/key"), info.xpath("/path/to/nodes/value") ): if x.text == '1': print(y.text) 我最后这么做的
snakeemail 2020-02-01
  • 打赏
  • 举报
回复
请问为什么我这个不行? 我这是按xpath标准写的 target = root.xpath('/root/body/items[source=bb]') 下面的contains是从哪个api查到的?我查了官方的文档,没找到 target = root.xpath('/root/body/items[contains(source/text(),"bb")]/target/text()')
冰风漫天 2020-02-01
  • 打赏
  • 举报
回复
这样直接找也可以的,原本以为不可以

root = etree.fromstring(xml_string) #etree.parse('test.xml')
target = root.xpath('/root/body/items[contains(source/text(),"bb")]/target/text()')
print(target)
冰风漫天 2020-02-01
  • 打赏
  • 举报
回复

root = etree.fromstring(xml_string) #etree.parse('test.xml')
target = [''.join(e.xpath('target/text()')) for e in root.xpath('/root/body/items') if ''.join(e.xpath('source/text()'))=='bb']
print(target)

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧