网络爬虫 - 5 Xpath的使用方法与爬取案例

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属性包含ava
//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”

猜你喜欢

转载自blog.csdn.net/hanbo6/article/details/81637337