python - 如何在 lxml 中使用带有 find/findall 的 xml 命名空间?

标签 python xml lxml xml-namespaces elementtree

我正在尝试解析 OpenOffice ODS 电子表格中的内容。 ods 格式本质上只是一个包含许多文档的 zip 文件。电子表格的内容存储在“content.xml”中。

import zipfile
from lxml import etree

zf = zipfile.ZipFile('spreadsheet.ods')
root = etree.parse(zf.open('content.xml'))

电子表格的内容在一个单元格中:

table = root.find('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table')

我们也可以直接去行:

rows = root.findall('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table-row')

各个元素都知道命名空间:

>>> table.nsmap['table']
'urn:oasis:names:tc:opendocument:xmlns:table:1.0'

如何在 find/findall 中直接使用命名空间?

显而易见的解决方案不起作用。

试图从表中获取行:

>>> root.findall('.//table:table')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lxml.etree.pyx", line 1792, in lxml.etree._ElementTree.findall (src/lxml/lxml.etree.c:41770)
  File "lxml.etree.pyx", line 1297, in lxml.etree._Element.findall (src/lxml/lxml.etree.c:37027)
  File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 225, in findall
    return list(iterfind(elem, path))
  File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 200, in iterfind
    selector = _build_path_iterator(path)
  File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 184, in _build_path_iterator
    selector.append(ops[token[0]](_next, token))
KeyError: ':'

最佳答案

如果 root.nsmap 包含 table 命名空间前缀,那么您可以:

root.xpath('.//table:table', namespaces=root.nsmap)

findall(path) 接受 {namespace}name 语法而不是 namespace:name。因此,在将 path 传递给 findall() 之前,应该使用命名空间字典对 {namespace}name 表单进行预处理。

关于python - 如何在 lxml 中使用带有 find/findall 的 xml 命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4210730/

相关文章:

python - 将 WTForms 字段标签与字符串进行比较总是返回 False

android - 使用 Maven 构建 Android 项目时出错

javascript - 如何使用 jQuery 转义或替换 xml 文件中的 "&"?

python - lxml 运行时错误 : Reason: Incompatible library version: etree. 所以需要版本 12.0.0 或更高版本,但 libxml2.2.dylib 提供版本 10.0.0

python - 相同的 xpath 在 Centos、Ubuntu 上返回不同的值

python - 需要一个测试用例,其中给定的最小硬币数量代码在 python 中失败了吗?

python - 如何从 django 模板在 html 页面上打印漂亮的 JSON?

python - 在 Python 中打印函数时回显结果的正确术语

java - Android Studio : Preview of the phone, 只显示屏幕,不显示屏幕周围

python - 网页抓取器返回元素列表