1.Xpath简介
(1)xml概念: 被设计用来传输和存储数据,和json同处于一个位置,但是目前以json居多
(2)xml和html的不同点:
(a)xml用来传输数据,html用来显示数据
(b)xml的标签没有被预定义,html的标签是预定义好的
(c)xml具有自我描述性
(3)常用的路径表达式:
/ : 从根节点开始查找
// : 从任意位置开始查找
. : 从当前节点开始查找
.. : 从父节点开始查找
@ :选取属性
(4)路径表达式
bookstore/book : 从bookstore下面找book节点,book必须是bookstore的直接子节点
bookstore//book : 从bookstore下面找book节点, book可以使直接子节点也可以是孙子节点
//book : 从文档中任意位置找book节点
//@lang : 查找所有拥有lang属性的节点
bookstore/book[1] : 直接子节点第一个book,下标从1开始
bookstore/book[last()] : 直接子节点最后一个book
bookstore//book[last()] : 所有book里面的最后一个
bookstore/book[last() - 1] : 倒数第二个book
bookstore/book[position()<3] : 取出前两个book
//title[@lang] : 所有拥有lang属性的title节点
//title[@lang=eng] : 所有的lang属性值为eng的title节点
bookstore/* : bookstore下面所有的直接子节点
bookstore//* : bookstore下面所有的子节点
//title[@*] : 有属性的title节点
//book/title | //book/price : 找到所有book节点下面的直接子节点title和price
(5)Xpath函数
contains : 包含
starts-with : 以某某开始
ends-with : 以某某结尾
由于html和xml很像,所以有一个第三方库就封装了使用xpath来解析html数据的接口:
pip install lxml
使用的时候,首先需要使用插件进行测试xpath,然后再来到代码中进行编写
xpath插件使用:
(a)属性筛选
//input[@id="kw"] 找到属性id值为kw的input节点
(b)层级筛选
通过属性和层级筛选
//div[@id="head"]/div/div[@id="u1"]/a[2]
2.xpath使用
(1)属性筛选
//input[@id="kw]
//span[@class="bg s_ipt_wr quickdelete-wrap"]
通过class进行选择的时候,需要将所有的class全部写进来才可以
(2)索引和层级
//div[@id="head"]/div/div[@id="u1"]/a[2]
(3)获取内容和属性
//div[@id="u1"]/a[2]/text() 获取内容
//div[@id="u1"]/a[2]/@href 获取属性
(4)xpath函数
选出class属性以mn开头的a
//div[@id="u1"]/a[starts-with(@class,"mn")]
选出内容以地开头的a
//div[@id="u1"]/a[starts-with(text(),"地")]
选出class属性包含av的a
//div[@id="u1"]/a[contains(@class,"av")]
选出内容包含多产的a
//div[@id="u1"]/a[contains(text(),"多产")]
代码中使用xpath,首先将文档生成对象,然后根据对象的方法找到想要的节点。可以是本地文件,也可以是网络文件.
xpath方法返回的是一个列表,通过下标进行取内容
//*[@id="u1"]/a[2]
//*[@id="su"] #su #form > input[type="hidden"]:nth-child(14)
3.xpath使用案例(见代码24-26)
懒加载:比如一个网页中有100个图片。需要101次请求才能加载完毕。首先加载出现在可视区内的图片,在可视区外的图片多没有加载。在用户滚动滚动条的时候,通过js动态的去监听当前这个图片有没有出现在可视区,如果出现在可视区,再去加载这个图片
出现的形式: src2 data-src data-original class=”lazy”