
2.1 处理HTML和XML数据

因为HTML和XML是互联网应用中的最常用网页标记语言,是开发网页程序的核心技术,所以用Python处理HTML和XML页面至关重要。在本节的内容中,将详细讲解使用Python语言处理HTML和XML数据的知识。
2.1.1 解析XML数据
XML是可扩展标记语言(Extensible Markup Language)的缩写,是标准通用标记语言的子集。在Python应用程序中,有两种常见的XML编程接口,分别是SAX和DOM。因此Python语言有对应的两种解析XML文件的方法:SAX和DOM。
在Python语言中,使用库xml实现XML的处理功能,库xml由如下核心模块构成。
● xml.etree.ElementTree:提供处理ElementTree的成员,是一个轻量级的XML处理器。
● xml.dom:用于定义DOM的API,提供了处理DOM标记的成员。
● xml.dom.minidom:提供了处理最小DOM的成员。
● xml.dom.pulldom:提供了构建部分DOM树的成员。
● xml.sax:提供了处理SAX2的基类和方法成员。
● xml.parsers.expat:绑定Expat解析器功能,能够使用注册处理器处理不同XML文档部分。
如下面的实例代码,演示了使用库xml.etree.ElementTree读取XML文件的过程。其中XML文件test.xml的具体实现代码如下所示。
源码路径:daima\2\2-1\test.xml

文件ElementTreeuse.py的功能是获取上述XML文件节中的点元素,具体实现代码如下所示。
源码路径:daima\2\2-1\ElementTreeuse.py


执行后会输出:

在下面的实例代码中,演示了使用SAX方法解析XML文件的过程。其中实例文件movies.xml是一个基本的XML文件,在里面保存一些与电影有关的资料信息。文件movies.xml的具体实现代码如下所示。
源码路径:daima\2\2-1\movies.xml


实例文件sax.py的功能是解析文件movies.xml的内容,具体实现代码如下所示。
源码路径:daima\2\2-1\sax.py


执行后的效果如图2-1所示。

图2-1 执行效果
在下面的实例文件dom.py中,演示了使用DOM方法解析XML文件的过程。实例文件dom.py的功能是解析文件movies.xml的内容,具体实现代码如下所示。
源码路径:daima\2\2-1\dom.py


执行后会输出:

在下面的实例代码中,演示了使用DOM获取XML文件中指定元素值的过程。其中XML文件user.xml的代码如下所示。
源码路径:daima\2\2-1\user.xml

实例文件domuse.py的功能是解析文件movies.xml的内容,具体实现代码如下所示。
源码路径:daima\2\2-1\domuse.py


执行后会输出:

2.1.2 使用库beautiful soup解析数据
beautiful soup是一个重要的Python库,其功能是将HTML和XML文件的标签文件解析成树形结构,然后提取HTML或XML文件中指定标签属性对应的数据。库beautiful soup经常被用在爬虫项目中,通过使用此库可以大大提高开发效率。
beautiful soup 3目前已经停止维护,其官方推荐使用beautiful soup4,本书讲解的是beautiful soup4。开发者可以使用如下两种命令安装库beautiful soup4。

安装beautiful soup4后还需要安装文件解析器,beautiful soup4不但支持Python标准库中的HTML解析器,而且还支持第三方的解析器(如lxml)。根据开发者所用操作系统的不同,可以使用如下命令来安装lxml。

在下面的实例文件bs01.py中,演示了使用库beautiful soup4解析HTML代码的过程。
源码路径:daima\2\2-1\bs01.py

通过上述代码,解析了html_doc中的HTML代码,执行后输出解析结果:

在下面的实例文件bs02.py中,演示了使用库beautiful soup解析指定HTML标签的过程。
源码路径:daima\2\2-1\bs02.py


执行后将输出指定标签的信息:

2.1.3 使用库bleach解析数据
在使用Python开发Web程序时,开发者面临一个十分重要的安全性问题:跨站脚本注入攻击(黑客利用网站漏洞从用户一端盗取重要信息)。为了解决跨站脚本注入攻击漏洞,最常用的做法是设置一个访问白名单,设置只显示指定的HTML标签和属性。在现实应用中,最常用的HTML过滤库是bleach,能够实现基于白名单的HTML清理和文本链接模块。
我们可以使用如下两种命令安装库bleach。

在下面的实例文件guolv.py中,演示使用方法bleach.clean()过滤处理HTML标签的过程。
源码路径:daima\2\2-1\guolv.py


执行后会输出:

2.1.4 使用库cssutils解析数据
在Python程序中可使用库cssutils解析和构建CSS级联样式表。在库cssutils中只有DOM解析模块,没有任何渲染功能。可以使用如下两种命令安装库cssutils。


在下面的实例文件css01.py中,演示了使用库cssutils处理CSS标记的过程。
源码路径:daima\2\2-1\css01.py

执行后会输出:

2.1.5 使用库html5lib解析数据
在Python程序中,可以使用库html5lib解析HTML文件。库html5lib是用纯Python语言编写实现的,其解析方式与浏览器相同。在2.1.2讲解的库beautiful soup使用Lxml解析器,而库Html5lib是beautifulsoup支持的另一种解析器。
我们可以使用如下两种命令安装库html5lib:

在下面的实例文件ht501.py中,演示了使用html5lib解析HTML文件的过程。
源码路径:daima\2\2-1\ht501.py

执行后会输出:

2.1.6 使用库markupsafe解析数据
在Python程序中,使用库markupsafe可以将具有特殊含义的字符替换掉,以减轻注入攻击(把用户输入、提交的数据当作代码来执行),将不受信任用户的输入信息安全地显示在页面上。
可以使用如下两种命令安装库markupsafe。

在下面的实例文件mark01.py中,演示了使用库markupsafe构建安全HTML的过程。
源码路径:daima\2\2-1\mark01.py

执行后会输出:

2.1.7 使用库pyquery解析数据
在Python程序中,可以使用库pyquery解析HTML文件的内容。pyquery是JS框架jquery的Python版,是用Python语言仿照jquery源码实现的,其语法与jquery几乎完全相同。
可以使用如下两种命令安装库pyquery。

在下面的实例文件pyq01.py中,演示了使用库pyquery实现字符串初始化的过程。
源码路径:daima\2\2-1\pyq01.py


在上述代码中,由于pyquery的编写比较麻烦,所以在导入时添加了别名pq:

上述代码中的doc是一个pyquery对象,可以通过doc进行元素的选择,这里就是一个CSS选择器,所以CSS选择器的规则都可以用,直接通过doc(标签名)获取该标签所有的的内容。若想要获取class,则doc('.class_name'),如果是id,则doc('#id_name')。执行后会输出:
