解析库的使用
使用XPath
- XPATH全称XML Path Language,即XML路径语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索
- XPath的常用规则
- nodename:选取此节点的所有子节点
- /:从当前节点选取直接子节点
- //:从当前节点选取子孙节点
- . :选取当前节点
- … :选取当前节点的父节点
- @:选取属性
- //title[@lang=‘eng’]
- 这就是一个XPath规则,它代表选择所有名称为title,同时属性lang的值为eng的节点
- 实例引入
- 首先引入了lxml的etree模块
- 然后声明了一段HTML文本,调用HTML类进行初始化,这样就成功构造了一个XPath解析对象
- 这里需要注意的是,HTML文本的最后一个li节点是没有闭合的,但是etree模块可以自动修正HTML文本
- 调用tostring()方法即可输出修正后的HTML代码,但是结果是byes类型,这里利用decode()方法将其转成str类型
- 所有节点
- 一般会用//开头的XPath规则来选取所有符合要求的节点
- 返回形式是一个列表,如果要取出其中一个对象,可以直接用中括号加索引
- 每个元素是Element类型
- 子节点
- 通过/ 或者//即可查找元素的直接子节点或子孙节点
- 比如:xpath(//li/a)获取所有直接子节点,或者xpath(//li//a)获取所有的子孙节点
- 父节点
- 获取父节点的方式:…或者parent::
- 属性匹配
- 可以用@符号进行属性过滤,比如,这里如果要选取class为item-0的li节点
- 可以用@符号进行属性过滤,比如,这里如果要选取class为item-0的li节点
- 文本获取
- 可以用XPath中的**text()**方法获取节点中的文本,只是文本,不包括节点
- 属性获取
- 获取节点属性还是用@符号就可以了
- 此处和属性匹配的方法不同,属性匹配是中括号加属性名和值来限定某个属性,如[@href=“link1.html”],而此处的@href指的是获取节点的某个属性,二者需要做好区分
- 获取节点属性还是用@符号就可以了
- 属性多值匹配
- 如果节点的某个属性有两个值得话,用之前的属性匹配就获取不到了,这时候就要使用contains()函数,如下:
- 第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值,就可以完成匹配
- 如果节点的某个属性有两个值得话,用之前的属性匹配就获取不到了,这时候就要使用contains()函数,如下:
- 多属性匹配
- 根据多个属性确定一个节点,使用运算符 and 来连接,如下:
- 根据多个属性确定一个节点,使用运算符 and 来连接,如下:
- 按序选择
- 匹配多个节点时,若只要其中一个的话,有以下方法
- 使用序号来获取,比如li[1],注意这里的序号是从1开始的,而不是从0开始
- 使用函数,比如last(),position()等
- 匹配多个节点时,若只要其中一个的话,有以下方法
- 节点轴