Lxml库
Lxml库是基于libxm12的XML解析库的Python封装,该模块使用C语言编写,解析的速度比Beautiful Soup更快。Lxml库使用Xpath语法解析定位网页数据。
Lxml库的安装
pip install lxml
Lxml库的使用
1、修正HTML代码
Lxml为XML解析库,但也很好地支持了HTML文档地解析功能,这为使用Lxml库爬取网络信息提供了支持条件。
首先需要导入Lxml库中地etree库,利用etree.HTML进行初始化,返回解析后的Element对象,这里可以看到,Lxml有一个非常实用的功能,就是自动修正了HTML代码(比如标签对漏掉的情况也会自动补齐)。
2、读取HTML文件
将上面的HTML文件拷贝到Sublime中保存为HTML文件。
然后通过Lxml库读取HTML文件中的内容。
3、解析HTML文件
经过上面的步骤,便可以使用requests库获取HTML文件,然后用Lxml库来解析HTML文件。
Xpath语法
Xpath是一门在XML文档中查找信息的语言,对HTML文档又很好的支持。
<user_databaser> <user> <name> Jack </name> <sex> Male </sex> <id> 10001 </id> <goal> 100 </goal> </user> </user_databaser> |
【基本概念】
- 父节点:每个元素及属性都有一个父节点,上例中的user元素就是name、sex、id和goal的父节点;
- 子节点:元素节点可以有0个或者多个子节点,上例中的name、sex、id和goal元素就是user的子节点;
- 同胞节点:拥有相同父节点,上例中的name、sex、id和goal元素就是同胞节点;
- 先辈节点:某节点的父节点、父节点的父节点等,上例中的name元素的先辈节点是user和user_database;
- 后代节点:某个节点的子节点、子节点的子节点等,上例中的user_database元素的后代节点是user、name、sex、id和goal;
Xpath使用路径表达式在XML文档中选取节点,节点是通过沿着路径或者step来选取的。
表达式 | 描述 |
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
根据上例举例说明:
路径表达式 | 结果 |
user_databaser | 选取元素user_databaser的所有子节点 |
/user_databaser | 选取根元素user_databaser |
user_databaser/user | 选取属于user_databaser的子元素的所有user元素 |
//user | 选取所有user子元素,不考虑他们在文档中位置 |
user_databaser//user | 选取属于user_databaser元素的后代所有user元素,不管位置 |
//@attribute | 选取名为attribute的所有属性 |
Xpath中也可以使用通配符来选取位置的元素,常用的就是“*”通配符,它可以匹配任何元素节点。
Xpath语法中的谓语用来查找某个特定的节点或者包含某个指定值的节点,谓语被嵌在方括号中。
路径表达式 | 结果 |
/user_databaser/user[1] | 选取属于user_databaser子元素的第一个user元素 |
//li{[@attribute] | 选取所有拥有名为attribute属性的li元素 |
//li{[@attribute=’red’] | 选取所有li元素,且这些元素拥有值为red的attribute属性 |