Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在lxml中通过find/findall使用xml名称空间?

如何在lxml中通过find/findall使用xml名称空间?
EN

Stack Overflow用户
提问于 2010-11-18 01:07:30
回答 3查看 31.5K关注 0票数 33

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

代码语言:javascript
运行
AI代码解释
复制
import zipfile
from lxml import etree

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

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

代码语言:javascript
运行
AI代码解释
复制
table = root.find('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table')

我们也可以直接使用行:

代码语言:javascript
运行
AI代码解释
复制
rows = root.findall('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table-row')

各个元素知道名称空间:

代码语言:javascript
运行
AI代码解释
复制
>>> table.nsmap['table']
'urn:oasis:names:tc:opendocument:xmlns:table:1.0'

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

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

尝试从表中获取行:

代码语言:javascript
运行
AI代码解释
复制
>>> 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: ':'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-18 01:39:21

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

代码语言:javascript
运行
AI代码解释
复制
root.xpath('.//table:table', namespaces=root.nsmap)

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

票数 26
EN

Stack Overflow用户

发布于 2013-12-19 18:34:07

下面是获取XML文档中所有名称空间的方法(假设没有前缀冲突)。

当我预先知道名称空间URL是什么,并且只知道前缀时,我就会在解析XML文档时使用它。

代码语言:javascript
运行
AI代码解释
复制
        doc = etree.XML(XML_string)

        # Getting all the name spaces.
        nsmap = {}
        for ns in doc.xpath('//namespace::*'):
            if ns[0]: # Removes the None namespace, neither needed nor supported.
                nsmap[ns[0]] = ns[1]
        doc.xpath('//prefix:element', namespaces=nsmap)
票数 11
EN

Stack Overflow用户

发布于 2018-08-30 18:29:05

如果XML文件中没有xmlns定义,Etree将找不到带名称空间的元素。例如:

代码语言:javascript
运行
AI代码解释
复制
import lxml.etree as etree

xml_doc = '<ns:root><ns:child></ns:child></ns:root>'

tree = etree.fromstring(xml_doc)

# finds nothing:
tree.find('.//ns:root', {'ns': 'foo'})
tree.find('.//{foo}root', {'ns': 'foo'})
tree.find('.//ns:root')
tree.find('.//ns:root')

有时这就是你得到的数据。那么,如果没有名称空间,该怎么办呢?

我的解决方案是:添加一个。

代码语言:javascript
运行
AI代码解释
复制
import lxml.etree as etree

xml_doc = '<ns:root><ns:child></ns:child></ns:root>'
xml_doc_with_ns = '<ROOT xmlns:ns="foo">%s</ROOT>' % xml_doc

tree = etree.fromstring(xml_doc_with_ns)

# finds what you're looking for:
tree.find('.//{foo}root')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4210730

复制
相关文章
控制名称空间的使用
如将对象投射到XML中所述,可以将类分配给名称空间,以便相应的XML元素属于该名称空间,还可以控制类的属性是否也属于该名称空间。
用户7741497
2022/07/04
1.1K0
lxml基本用法_XML是什么
lxml库结合libxml2快速强大的特性,使用xpath语法来进行文件格式解析,与Beautiful相比,效率更高。
全栈程序员站长
2022/11/15
7320
lxml基本用法_XML是什么
名称空间
using 声明和using 编译指令 using 声明将特定的名称添加到它所属的声明区域中。 using std::cout; 将cout添加到声明区中,声明扣可以用cout<<代替 std::cout<< int main() {   using std::cout;   cout<<"a";   std::cin.get(); } using声明使一个名称可用,而using 编译指令使所有的名称都可以用。 using namespace std; int main() {   cout<<"aa";
lpxxn
2018/01/31
1.9K0
python的lxml模块解析xml
IBM Research Report, San Jose, California RJ909 August 1971
kirin
2021/04/01
1K0
名称空间namespace
结构:例子:创建名为Jack的名称空间namespace Jack {int pal;void fetch();//可在后面再次使用名称空间定义函数struct Well{...};...}提供函数定义namesoace Jack{void fetch(){...}}访问命名空间:Jack::pal=12;Jack::Well mode; //创建Well结构类型元素modeJAck::fetch();------特征:可以全局,也可以位于另一个名称空间中,但不能在代码块中任何名称空间中的名称都不会与其他名
Alan_1
2023/04/30
9890
11-TypeScript中的名称空间
在后端开发语言中,比如C#中,可以将不同源代码文件中的代码通过名称空间组合到一起。一般一个类定义在一个源代码文件中,在功能上属于一个上下文的源代码文件通过名称空间进行组织。 在TypeScript中,可以将多个ts文件组织到一个名称空间中,这样调用方就可以使用名称空间和类名完成调用。在TypeScript中,通过module关键字定义名称空间,另外要通过名称空间完成成员 的访问,成员必须指定export关键字。 ts文件一: module Hys{ export class Doctor{
用户1910585
2018/05/04
1.1K0
Spring使用p名称空间配置属性
Spring的p标签是基于XML Schema的配置方式,目的是为了简化配置方式。
大黄大黄大黄
2018/09/14
9560
Spring使用p名称空间配置属性
lxml网页抓取教程
在本教程中,我们会学习lxml库和创建XML文档的基础知识,然后会处理XML和HTML文档。最后,我们将利用以上所学,融会贯通,看看如何使用lxml提取数据。本教程的每一步都配有实用的Python lxml示例。
用户7850017
2021/10/15
4.1K0
lxml网页抓取教程
JavaScript 解析 XML 时如何通过名称直接取到值?
同级的Attribute,有没有办法通过类似于 getXXXByName("aa") 得到0, getXXXByName("bb") 得到1呢?
阿敏总司令
2019/02/28
7320
Python-数据解析-lxml库-下
ElementTree 类中附带了一个类似于 XPath 路径语言的 ElementPath 类。
小团子
2019/07/18
6760
Python-数据解析-lxml库-下
如何在PHP中解析XML
XML解析器是一个程序,它可以将XML文档或代码转换为XML文档对象模型(DOM)对象。
Lemon黄
2020/07/07
3.7K0
关于带命名空间的中文XML的解析
本来感觉XML文件解析是一件很简单的事情,结果折腾了一两周没什么进展,直到昨天才陆陆续续找到了一些解决方案,现在把踩坑过程和解决过程一并叙说一遍。
python与大数据分析
2022/03/11
7170
spring开发_使用p名称空间配置属性
http://www.cnblogs.com/hongten/gallery/image/112563.html
Hongten
2018/09/13
4780
Could not find a version that satisfies the requirement lxml解决方法
今天ytkah在安装lxml时提示错误ERROR: Could not find a version that satisfies the requirement lxml (from versions: none),ERROR: No matching distribution found for lxml,升级一下pip试试
ytkah
2020/02/25
5.6K0
Could not find a version that satisfies the requirement lxml解决方法
Python 爬虫工具
Python3 默认提供了urllib库,可以爬取网页信息,但其中确实有不方便的地方,如:处理网页验证和Cookies,以及Hander头信息处理。 为了更加方便处理,有了更为强大的库 urllib3
Python知识大全
2020/02/13
1.5K0
Python 爬虫工具
X--名称空间详解
X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML代码将XAML代码编译为CLR代码。
莫问今朝
2018/08/31
1.5K0
X--名称空间详解
名称空间与作用域
函数内部的函数只能在函数内部调用,不能在函数外部调用,通过接下来的学习你将会知道为什么会出现这种情况。
py3study
2020/01/16
3990
名称空间与作用域
在Excel中处理和使用地理空间数据(如POI数据)
因为不是所有规划相关人员,都熟悉GIS软件,或者有必要熟悉GIS软件,所以可能我们得寻求另一种方法,去简单地、快速地处理和使用地理空间数据——所幸,我们可以通过Excel自带的“三维地图”功能来简单满足一些差不多够用的需求。
Sidchen
2020/08/02
11.3K0
Beautiful Soup与运用(猫眼电影榜单)
Beautiful Soup是Python的一个HTML/XML的解析库,可以用来获取网页信息 输入文档为Unicode 编码,输出文档为UTF-8编码,不需考虑编码问题
机器视觉CV
2019/07/15
5410
点击加载更多

相似问题

lxml和xml名称空间--使用find和findall获取XML标记值。

12

使用findall,Lxml迭代Xml

20

使用lxml解析python中的多个名称空间XML

11

使用lxml解析具有多个名称空间的xml

11

如何使用lxml将名称空间包含到xml文件中?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档