**前言:**今年博客更新的太少了,很多学习计划都因为工作原因延迟了,今年真的身心太疲惫了,终于有点能理解为什么有的同行们会无心学习了,今年同样也是吃老本的一篇博客,所谓好记性不如烂笔头,以前用的再熟的东西都会随着时间慢慢淡化掉。尤其是作为测试人员在面临不同的项目会让你用到不同的技术,在一个项目组待几年以前学过的东西很可能会忘个干净,这时间就体现出笔记的重要性了,哈哈哈,今天废话比较多啊,切入正题把。
学过自动化测试或者爬虫的小伙伴们肯定对xpath再熟悉不过了,xpath呢其实就是在xml中搜索内容的一门语言,也是通用性比较强的一种解析方式。
安装:
pip instl lxml
实现方式:
1、获取页面源代码
2、实列化一个etree对象,将需要解析的页面源代码放到对象中。
3、调用etree对象中的xpath方法结合着xpath表达式实现标签的定位。
xpath表达式:
- /:表示是从根节点开始定位,表示的是一个层级
- //:表示的是多个层级。可以表示从任意位置开始定位
- (‘//div[@class = “dong”]’) 根据属性定位
- (‘//div[@class = “song”]/p[3]’) 根据索引定位 (索引是从1开始的)
- (‘//div[@class=“tang”]//li[5]/a/text()’)[0] /text()获取标签中直系的文本 取到标签中的文字,返回的是一个列表所以必须要用列表返回。
//text()获取标签中所有的文本内容 - ('//div[@class=“tang”]/li/@tag) 取标签中的属性
举例实现
定位该页面所有的项目名称:
import requests
from lxml import etree
url = 'https://nanjing.zbj.com/search/service/?kw=saas&r=1&nt=3606&fcn' \
'=%E7%94%B5%E5%AD%90%E5%95%86%E5%9F%8E%E7%B3%BB%E7%BB%9F'
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/103.0.0.0 Safari/537.36'
}
resp = requests.get(url=url, headers=header) # 获取页面源代码
html = etree.HTML(resp.text) # 实列化一个etree对象,将需要解析的页面源代码放到对象中
从根节点开始定位获取项目名称:
devis = html.xpath('//*[@id="__layout"]/div/div[2]/div/div[4]/div[4]/div[1]/div[1]/div/div[3]/div[2]/a/text()') # 使用了多层级组合属性结合单层级的定位方法
print(devis)
# 打印:['微信小程序开发商城定制生鲜配送外卖同城社交婚恋直播考试']
获取某个标签内容:
html = etree.HTML(resp.text)
devis = html.xpath('//*[@id="__layout"]/div/div[2]/div/div[4]/div[4]/div[1]/div[1]/div/@data-trace-id')
print(devis)
# 打印:['f58e8d25-a56a-40c6-8335-cac6633228310001']
获取当前页面所有项目标题
定位所有项目的父标签:
devis = html.xpath('//*[@id="__layout"]/div/div[2]/div/div[4]/div[4]/div[1]') # 找到项目详情的上级标签并解析
for dev in devis: # 循环上级标签
n = 1
for i in range(50): # 分析页面标签分布,循环得到所有项目名称
n += 1
label = dev.xpath('./div[{}]/div/div[2]/div[2]/a/text()'.format(n))
print(label)
打印: