xpath解析:最常用且最便捷高效的一种解析方式,通用性
-xpath解析原理:
-1、实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
-2、调用etree对象中的xpath方法结合这xpath表达式实现标签的定位和内容的捕获
-环境的安装:
-pip install lxml
-如何实例化一个etree对象:from lxml import etree
-1、将本地的html文档中的源码加载到etree对象中:
etree.parse(filePath,etree.HTMLParser())
-2、可以将从互联网上获取的源码数据加载到该对象
etree.HTML(‘page_text’)
-xpath(‘xpath表达式’)
-xpath表达式:
- /:表示的是从根节点开始定位,表示的是一个层级
- //:表示的是多个层级,可以表示从任意位置开始定位
-属性定位: //div[@class=’song’] tag[@attrName=”attrValue”]
-索引定位://div[@class=’song]/p[3] 索引从1开始的
-取文本
- /text() 获取的是标签中直系的文本内容
- //text() 标签中非直系的文本内容(所有的文本内容)
-取属性:
/@attrName ==> img/src
基础:

实例一:xpath_4k图片下载
先查询网页的编码标准

表示该网页编码标准为GBK
1 import os 2 3 import requests 4 from lxml import etree 5 6 if __name__=="__main__": 7 url="http://pic.netbian.com/4kfengjing/" 8 headers={ 9 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36' 10 } 11 response=requests.get(url=url,headers=headers) 12 response.encoding="GBK" 13 page_text=response.text 14 tree=etree.HTML(page_text) 15 16 li_list=tree.xpath('//div[@class="slist"]/ul/li') 17 #print(li_list) 18 19 20 #创建文件夹 21 if not os.path.exists('./picLibs'): 22 os.mkdir('./picLibs') 23 24 for li in li_list: 25 img_url='http://pic.netbian.com/'+li.xpath('./a/img/@src')[0] 26 27 img_name=li.xpath('./a/img/@alt')[0]+'.jpg' 28 29 #下载图片 30 img_data=requests.get(url=img_url,headers=headers).content 31 #图片永久化存储 32 img_path='picLibs/'+img_name 33 34 with open(img_path,'wb') as fp: #图片二进制存储 35 fp.write(img_data) 36 print(img_name+' 爬取成功!!!')
实例二:xpath_全国城市名称爬取

1 import requests 2 3 from lxml import etree 4 5 if __name__=="__main__": 6 url="https://www.aqistudy.cn/historydata/" 7 headers={ 8 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36' 9 } 10 11 page_text=requests.get(url=url,headers=headers).text 12 13 tree=etree.HTML(page_text) 14 15 li_list=tree.xpath('//div[@class="bottom"]/ul/li | //div[@class="bottom"]/ul/div[2]/li') 16 all_city_names=[] 17 for li in li_list: 18 city_name=li.xpath('./a/text()')[0] 19 all_city_names.append(city_name) 20 21 print(all_city_names)