xpath知识储备
-1.下载:pip install lxml
-2.导包:from lxml import etree
-3.创建etree对象进行指定对象的解析
-本地:etree=etree.parse('本地文件路径')
etree.xpath('xpath表达式')
-网络:etree=etree.parse('网络请求到的页面数据')
etree.xpath('xpath表达式')
xpath常用表达式
- 属性定位:
找到class属性为song的div标签
//div[@class="song"]
- 层级&索引定位
找到class为tang的div直系子标签下的ul下的第二个li下的a
//div[class="tang"]/ul/li[2]/a
- 逻辑定位
找到href属性为空且class属性为do的a标签
//a[@href="" and @class="du"]
- 模糊匹配
//div[contains(@class, "ng")] 包含
//div[starts-with(@class,"ta")] 以。。。开头
- 取文本
/text() 表示获取某个标签下的文本内容
//text() 表示获取某个标签下的文本内容和所有子标签的文本内容
//div[@class="song"]/p[1]/text()
//div[@class="tang"]//text()
- 取属性
//div[@class="tang"]//li[2]/a/@href
注意: 返回值都是列表
练习
- 需求:用xpath对段子网的内容和标题进行解析,持久化存储
import requests from lxml import etree #1.指定url url='https://ishuo.cn/joke/' #2.发起请求 # 自定义请求头信息 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } response = requests.get(url,headers=headers) #3.获取数据 page_text=response.text #4.解析数据 tree = etree.HTML(page_text) # 获取所有的li标签 返回列表中是element类型对象,可以继续调用xpath对其中的内容进行解析 li_list = tree.xpath('//div[@id="list"]/ul/li') f = open('./段子.txt','w',encoding='utf-8') for li in li_list: title = li.xpath('./div[@class="info"]/a/text()')[0] content = li.xpath('./div[@class="content"]/text()')[0] #5.持久化存储 f.write(title+'\n '+content+'\n\n') print('写入完成')
xpath插件
可以直接将表达式作用于浏览器当中,测试通过再用到代码中。
- 安装:更多工具》》拓展程序》》开启开发者模式》》将网上下载的xpath插件拖动到页面
-打开关闭的快捷键:ctrl+shift+x