Python lxml如何用XPath获取嵌套含文本'1'的c元素的b元素?
XPath解决方案:获取包含文本为'1'的c元素的b元素
当然可以用XPath实现这个需求!你之前的表达式有两个小问题导致失败,咱们一步步来修正:
问题分析
你写的表达式aElementObject.xpath("b[//c[text()='1']")有两个明显问题:
- 语法错误:缺少闭合的方括号
],导致XPath解析失败 - 路径范围错误:
//c是全局路径,会匹配整个文档中所有文本为'1'的c元素,而不是当前b元素下的嵌套c元素
可行解决方案
根据你的需求(获取嵌套了文本为'1'的c元素的b元素),正确的XPath表达式分两种场景:
场景1:c是b的任意后代元素(多层嵌套)
使用相对路径.//c来限定只查找当前b元素下的所有后代c元素,完整表达式:
aElementObject.xpath("b[.//c/text()='1']")
.//c:表示从当前b元素节点出发,查找所有层级的后代c元素text()='1':精确匹配c元素的文本内容为'1'- 注意:如果c元素的文本包含空白字符(比如换行、空格),可以用
normalize-space(.//c)='1'来忽略空白干扰
场景2:c是b的直接子元素(仅一层嵌套)
如果c是b的直接子节点,表达式可以简化为:
aElementObject.xpath("b[c/text()='1']")
示例验证
假设你的XML结构如下:
<a> <b> <d> <c>1</c> </d> </b> <b> <c>2</c> </b> <b> <c> 1 </c> <!-- 包含空白的情况 --> </b> </a>
- 用
b[.//c/text()='1']会匹配第一个b元素 - 用
b[normalize-space(.//c)='1']会匹配第一个和第三个b元素
内容的提问来源于stack exchange,提问作者user5326354
相关产品推荐
相关产品推荐

