Python 使用lxml和path解析xml,但如果有xmlns声明,则获取空列表

Python 使用lxml和path解析xml,但如果有xmlns声明,则获取空列表,python,xml,xpath,lxml,Python,Xml,Xpath,Lxml,我有一个xml文件,需要解析标记的值。元素的XPATH是“//provider”。如何使用lxml解析此标记?这是xml的开始: <?xml version="1.0" encoding="UTF-8"?> <package xmlns="http://..."> <provider>testmovieprovider</provider> <language>ja-JP</language> <

我有一个xml文件,需要解析标记的值。元素的
XPATH
“//provider”
。如何使用
lxml
解析此标记?这是xml的开始:

<?xml version="1.0" encoding="UTF-8"?>
<package xmlns="http://...">
    <provider>testmovieprovider</provider>
    <language>ja-JP</language>
    <!-- more stuff -->
</package>

使用
xml名称空间尝试xpath

我添加了名称空间
xmlns=”http://codespeak.net/ns/test1“

然后使用以下代码

>>> xml_node = etree.fromstring(st)
>>> xml_node.xpath('//t:provider/text()',namespaces={'t': 'http://codespeak.net/ns/test1'})
['testmovieprovider']
>>>
我的
st
字符串是

'<?xml version="1.0" encoding="UTF-8"?>
 <package xmlns="http://codespeak.net/ns/test1">
 <provider>testmovieprovider</provider>
 <language>ja-JP</language>
 <!-- more stuff -->
 </package>'
'
测试电影提供商
日语
'

尝试以下XPath:


/*/*[local-name()='provider']

向我们展示示例xml文件或向我们展示
xml
的内容查看此链接。然后尝试使用xpath和名称空间。谢谢,为什么您的工作正常,但使用普通的
//提供程序
无法捕获它?@David42-这是因为默认名称空间。这很棘手,因为没有前缀。如果您的xmlns类似于
xmlns:foo=”http://...“
,您可以使用
//foo:provider
。另外,我没有使用
/
,因为它效率低下。如果您已经知道,使用更显式的路径会更有效。但是,您也可以使用:
/*[local-name()='provider']
'<?xml version="1.0" encoding="UTF-8"?>
 <package xmlns="http://codespeak.net/ns/test1">
 <provider>testmovieprovider</provider>
 <language>ja-JP</language>
 <!-- more stuff -->
 </package>'