lxml xpath 过滤器中的 OR 条件不生效

3 投票
2 回答
2809 浏览
提问于 2025-04-21 05:25

langs对象是一个lxml对象,它是通过解析这个文件生成的:http://www.loc.gov/standards/codelists/languages.xml

这个xpath是可以正常工作的:

langs.node.xpath("//lang:language[lang:name='English']", namespaces={'lang':'info:lc/xmlns/codelist-v1'})[0].findtext('lang:name', namespaces={'lang': 'info:lc/xmlns/codelist-v1'})

当我像这样添加一个额外的条件| lang:code = 'English'时:

langs.node.xpath("//lang:language[lang:name='English' | lang:code='English']", namespaces={'lang':'info:lc/xmlns/codelist-v1'})[0].findtext('lang:name', namespaces={'lang': 'info:lc/xmlns/codelist-v1'})

我得到了一个错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "lxml.etree.pyx", line 1509, in lxml.etree._Element.xpath (src/lxml /lxml.etree.c:50717)
  File "xpath.pxi", line 318, in lxml.etree.XPathElementEvaluator.__call__ (src/lxml/lxml.etree.c:145969)
  File "xpath.pxi", line 238, in lxml.etree._XPathEvaluatorBase._handle_result (src/lxml/lxml.etree.c:144977)
  File "xpath.pxi", line 223, in lxml.etree._XPathEvaluatorBase._raise_eval_error  (src/lxml/lxml.etree.c:144785)
XPathEvalError: Invalid type

2 个回答

3

再多花10分钟在谷歌上搜索,我就找到了答案:

我把 | 改成了 or

langs.node.xpath("//lang:language[lang:name='English' or lang:code='English']", namespaces={'lang':'info:lc/xmlns/codelist-v1'})[0].findtext('lang:name', namespaces={'lang': 'info:lc/xmlns/codelist-v1'})
7

正确的写法是 or,而不是 |

nsmap={'lang': 'info:lc/xmlns/codelist-v1'}
langs.node.xpath("//lang:language[lang:name='English' or lang:code='English']",
  namespaces=nsmap)[0].findtext('lang:name', namespaces=nsmap)

撰写回答