相关疑难解决方法(0)

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

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

import zipfile
from lxml import etree

zf = zipfile.ZipFile('spreadsheet.ods')
root = etree.parse(zf.open('content.xml'))
Run Code Online (Sandbox Code Playgroud)

电子表格的内容位于单元格中:

table = root.find('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table')
Run Code Online (Sandbox Code Playgroud)

我们也可以直接寻找行:

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

各个元素知道命名空间:

>>> table.nsmap['table']
'urn:oasis:names:tc:opendocument:xmlns:table:1.0'
Run Code Online (Sandbox Code Playgroud)

如何在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 …
Run Code Online (Sandbox Code Playgroud)

python xml lxml elementtree xml-namespaces

26
推荐指数
3
解决办法
2万
查看次数

标签 统计

elementtree ×1

lxml ×1

python ×1

xml ×1

xml-namespaces ×1