1、引入
在Python的爬虫项目中,通常需要解析获取到的页面内容,得到特定节点中的数据。所以需要解析工具,可以选择:正则式,bs4,xpath等。在这里我们选择使用Xpath对HTML内容解析
XPath,全称XML Path Language,即XML路径语言,可以在XML,HTML文档中查找信息的语言,XPath的选择功能十分强大,提供了非常简明了的路径选择表达式。
xpath解析:最常用且最便捷高效的一种解析方式,也具有通用性。
xpath解析原理:
- 实例化一个etree的对象,把需要解析的页面源码数据加载到该对象中
- 调用etree对象中的xpath方法,结合xpath的表达式实现标签定位和内容的捕获
2、使用
安装第三方库 pip install lxml
引入etree对象:from lxml import etree
加载HTML数据:
- 本地文件加载 etree.parse(file_url)
- 网络资源加载 etree.HTML(html_text) #requests.text
返回的是一个对象,可以调用xpath方法
xpath表达式
在Chrome浏览器中,可以直接选择节点,复制xpath表达式
- /:表示整个资源的根节点开始定位,表示的是一个层级
- //:表示多个层级,可以从任意位置开始
- 属性定位://div[@class='attrName'] #定位到div标签,且标签class='attrName',
- 索引定位://div[@class='attrName']/p[2] #div节点的下一级第二个p元素节点 ,索引定位是1开始
- 取值:/text() #获取标签的直系文本内容 //text()获取标签下面所有节点的文本类容
- 取属性值:/@attrName #可以取对应节点下面的属性值
import requests from lxml import etree # 设置请求载体 headers = { # 在浏览器中,network查看 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36', } #读取糗事百科的内容 def get_zhifu_rank(): url='https://www.qiushibaike.com/' resqonse=requests.get(url,headers=headers) #获取页面资源 page_text=resqonse.text #构造一个etree对象 tree=etree.HTML(page_text) #xpath的表达式,得到想要的数据 #在浏览器的开发者工具中预览节点信息,在Chrome浏览器中可直接选择节点,copy xpath表达式 #从根节点开始,获取body下面的直属div,返回一个对象列表 # res=tree.xpath('/html/body/div') #获取根节点下面的,所有的div节点 # res=tree.xpath('/html//div') #从根节点开始,通过索引的形式,获取 # res = tree.xpath('/ html / body / div[2] / div[1] / div[1]') #从根节点开始,通过属性名称获取,如果属性名唯一,则中间层可以直接 //表示 #res = tree.xpath('/html//div[@class="index-head"]') # res = tree.xpath('/html//div[@id="index_header"]') #不从根节点开始查找 #从任意节点开始查询div,即查询所有的div节点 # res = tree.xpath('//div') #res = tree.xpath('/html//div') #查看节点中class名字为index-head的div节点 # res = tree.xpath('//div[@class="index-head"]') #查询class=col0的div下面的所有li节点 # res=tree.xpath('//div[@class="col0"]//li') #print(len(res),res) #取值 #取出所有的div中直属值 (不是div直属的值不取) # res = tree.xpath('/html//div/text()') #228个 #取出div中的所有下级的值 #res = tree.xpath('/html//div//text()') #645个 #res = tree.xpath('//div[@class="col0"]//li[3]//text()[0]') #你可以找到相应的节点,然后取值就好 #取属性值 #取出class为col0的div下面的第三个li标签中的a标签直属的href的属性值 # res = tree.xpath('//div[@class="col0"]//li[3]/a/@href') #标签中的所有href值 # res = tree.xpath('//div[@class="col0"]//li//@href') # print(len(res), res) #可以设置多个节点 #得到li标签的对象列表 # li = tree.xpath('//div[@class="col0"]//li') #具体对象中的值,可以循环取值 ./表示在当前目录下 # res = li[2].xpath('./a/@href') # print(len(res), res)
具体示例: