Python 2.7 lxml etree iterfind传入变量语法问题求助
解决lxml etree中用变量索引遍历节点的问题
嘿,我来帮你搞定这个问题!首先提个小细节:你原来的XPath表达式./level1/level2/level3/[2]其实有点小问题——这里的/[2]是选取当前节点的第二个子节点,但你实际想选的应该是level2下的第2个level3节点,正确写法是./level1/level2/level3[2](去掉level3后面的斜杠)。
接下来回到你的需求:用变量i替换固定索引遍历所有对应节点,有两种常用方法:
方法一:字符串格式化构造带变量索引的XPath
XPath支持从1开始的位置索引,你可以通过字符串格式化把变量i插入到表达式中,逐个获取节点:
# 先获取所有匹配的level3节点,确定循环范围 all_level3_nodes = mytree.xpath('./level1/level2/level3') # XPath索引从1开始,循环范围设为1到节点总数+1 for i in range(1, len(all_level3_nodes) + 1): # 构造带变量索引的XPath node = mytree.find('./level1/level2/level3[{}]'.format(i)) if node is not None: print node.tag, node.text
这种方法适合你需要明确知道当前节点索引的场景,但要牢记XPath索引是从1开始的,和Python列表的0起始逻辑不同。
方法二:直接遍历所有匹配节点(更推荐)
其实lxml的iterfind方法本身就是用来遍历所有匹配节点的,完全不需要手动管理索引,代码更简洁高效:
# 直接遍历所有level3节点,自动处理所有实例 for y in mytree.iterfind('./level1/level2/level3'): print y.tag, y.text
这种方法省去了手动维护索引的麻烦,还能避免索引越界的问题,是处理这类遍历需求的最优解。
内容的提问来源于stack exchange,提问作者Scientific40
相关产品推荐
相关产品推荐

