哪个XML库适合什么用途?
搜索“python”和“xml”会找到很多可以把这两者结合起来的库。
这个列表可能不太准确:
- xml.dom
- xml.etree
- xml.sax
- xml.parsers.expat
- PyXML
- beautifulsoup?
- HTMLParser
- htmllib
- sgmllib
如果有人能简单总结一下每个库的使用场景和原因,那就太好了。
4 个回答
我平时不太用XML,但每当需要用到的时候,lxml 这个库让我觉得很舒服,而且速度也挺快的。在面向对象编程的环境下,元素树的接口设计得非常好。
我发现 xml.etree
基本上能满足我的所有需求,除了在需要解析一些损坏的 XML 时,这种情况不太常见,跟损坏的 HTML 不一样,后者到处都是,BeautifulSoup
可以帮忙处理这类问题。xml.etree
对于在内存中读取整个 XML 文档、浏览文档、创建文档以及逐步解析大型文档都有不错的支持。lxml
也支持相同的接口,而且通常速度更快——当你能安装第三方 Python 扩展时,这样可以提升性能(比如在 App Engine 上你不能这样做,但 xml.etree
依然可以使用,所以你可以运行完全相同的代码)。lxml
还提供了更多功能,并且也支持 BeautifulSoup
。
你提到的其他库模仿的是为其他语言设计的 API,总的来说,我觉得没有必要让 Python 变得那么复杂。如果你有一些非常具体的需求,比如支持 xslt、各种验证等等,可能值得去找找其他库,但我已经很久没有这样的需求了,所以对这些库的最新情况不太了解。
DOM和SAX是两种处理文档的基本方式。这不仅仅适用于Python,因为DOM和SAX是跨语言的。
DOM:把整个文档读入内存,然后进行操作。适合用在:
- 标签之间关系复杂的情况
- 小而复杂的XML文档
- 注意事项:
- 容易占用过多内存
SAX:在读取文档的同时进行解析。适合用在:
- 长文档或开放式流
- 内存有限的情况
- 注意事项:
- 你需要编写一个有状态的解析器,这可能会比较复杂
beautifulsoup:
非常适合处理HTML或格式不太规范的标记。使用起来简单且速度快。适合网页抓取等场景。它可以处理一些XML解析器会因为标记不正确而报错的情况。
其余的我没有使用过,但我觉得没有硬性规定什么时候用哪种方式。一般来说,考虑的因素包括:谁来维护代码,哪些API使用起来最方便,它们的效果如何等等。
总的来说,对于基本需求,使用标准库模块是不错的选择,因为它们是“标准”的,容易获取且大家都熟悉。不过,如果你需要深入研究某个问题,几乎总会有一些更新的非标准模块,功能更强大,超出了标准库的范围。