文章目录
- 爬虫之xpath
- 一、xpath概述
- 二、xpath解析原理
- 三、环境的安装
- 四、xpath语法
- 1、创建树结构获取数的根节点
- 2、根据xpath获取指定标签
- 1、绝对路径
- 2、相对路径
- 3、全路径
- 3、获取标签内容
- 4、获取标签的属性值
- 5、谓语
- 5.1 位置相关谓语
- 5.2 属性相关谓语
- 5.3 子标签内容相关谓语
- 6、通配符
- 7、若干路径
爬虫之xpath
一、xpath概述
xpath 是xml路径语言,是一门查找信息的语言。最初是用来搜索xml文档的,但同样也可适用于html文档的搜索,所以在做爬虫的时候可以用于适用xpath做响应的信息抽取。
xpath的功能十分强大,提供了简洁明了的路径选择表达式,还提供了超过100个的内建函数
xml数据格式:xml和json一样是一种通用的数据格式,是绝大部分编程语言都支持的数据类型,xml是通过标签的内容和属性来保存数据
json 数据格式 :
json={
"name" :"永辉超市",
"address":"肖家河大厦",
"staff" : [
{ "name":"小明","id": "s001","position":"收营员","salary": 4000},
{"name":"小花","id": "s002","position":"促销员","salary": 3500},
{"name":"张三","id": "s003","position":"保洁","salary": 3000},
{"name":"李四","id": "s004","position":"收营员","salary": 4000},
{"name":"王五","id": "s005","position":"售货员","salary": 3800}],
"goodsList" : [
{ "name" : "泡面","price": 3.5,"count": 120,"discount":0.9},
{"name":"火腿肠","price": 1.5,"count": 332,"discount":1},
{"name":"矿泉水","price": 2,"count": 549,"discount": 1},
{ "name":"面包","price": 1.5,"courrt": 120,"discount": 0.9}]
}
xml数据格式 01.xml
<supermarket name="永辉超市" address="肖家河大厦">
<staffs>
<staff id="s001">
<name>小明</name>
<position>收营员</position>
<salary>4000</salary>
</staff>
<staff id="s002">
<name>小花</name>
<position>促销员</position>
<salary>3500</salary>
</staff>
<staff id="s003">
<name>张三</name>
<position>保洁</position>
<salary>3000</salary>
</staff>
<staff id="s004">
<name>李四</name>
<position>收营员</position>
<salary>4000</salary>
</staff>
<staff id="s005">
<name>王五</name>
<position>售货员</position>
<salary>3800</salary>
</staff>
</staffs>
<goodsList>
<goods discount="0.9">
<name>泡面</name>
<price>3.5</price>
<count>120</count>
</goods>
<goods>
<name>火腿肠</name>
<price>1.5</price>
<count>332</count>
</goods>
<goods>
<name>矿泉水</name>
<price>2</price>
<count>549</count>
</goods>
<goods discount="8.5">
<name>面包</name>
<price>5.5</price>
<count>29</count>
</goods>
</goodsList>
</supermarket>
二、xpath解析原理
实例化一个etree对象,将需要被解析的页面源码数据加载到该用户中;调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获
三、环境的安装
1、方法一:window环境下 pycharm–Terminal
pip install lxml
2、方法二
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qgYtJiLy-1660870375514)(20数据解析格式.assets/1660788497181.png)]
四、xpath语法
1、创建树结构获取数的根节点
etree.XML(xml数据) etree.HTML(html数据)
from lxml import etree
f=open('file/01.xml',encoding='utf-8') # 01.xml 在上面已给出
root=etree.XML(f.read())
f.close()
2、根据xpath获取指定标签
节点对象.xpath(路径)
路径有三种写法:
1、绝对路径
路径用/
开头–/标签在树结构中的路径 (路径必须从根节点开始写)
from lxml import etree
f=open('file/01.xml',encoding='utf-8') # 01.xml 在上面已给出
root=etree.XML(f.read())
f.close()
result = root.xpath('/supermarket/staffs/staff/name ')----实例
2、相对路径
路径用.
开头表示当前节点 …表示上层节点(xpath前面是谁,.
就代表谁)
from lxml import etree
f=open('file/01.xml',encoding='utf-8') # 01.xml 在上面已给出
root=etree.XML(f.read())
f.close()
staff = root.xpath('./staffs/staff')[0] # 获取第一个员工对应的staff标签
result = staff.xpath('./name/text()')
print(result) # ['小明']
3、全路径
路径用//
开头–在整个树中找标签
from lxml import etree
f=open('file/01.xml',encoding='utf-8') # 01.xml 在上面已给出
root=etree.XML(f.read())
f.close()
result = root.xpath('//name/text()')
print(result) # ['小明', '小花', '张三', '李四', '王五', '泡面', '火腿肠', '矿泉水', '面包']
result = staff.xpath('//goods/name/text()')
print(result) # ['泡面', '火腿肠', '矿泉水', '面包']
注意: 绝对路径和全路径的写法以及查找方法和是用谁去点的xpath无关
3、获取标签内容
节点对象.xpath(获取标签的路径/text())
----获取指定路径下所有标签的标签内容
staff = root.xpath('./staffs/staff')[0]
result = staff.xpath('//goods/name/text()')
print(result) # ['泡面', '火腿肠', '矿泉水', '面包']
4、获取标签的属性值
节点对象.xpath(获取标签的路径/@属性名)
----获取指定路径下的指定属性名的标签属性
result = root.xpath('//staff/@id')
print(result) # ['s001', 's002', 's003', 's004', 's005']
5、谓语
5.1 位置相关谓语
[N] 第N个
[last()] 最后一个
[last()-N] :[last()-1]-倒数第二个 [last()-2]-倒数第三个
[position()>N]、[position<N]、[position>=N]、[position<=N]
staff = root.xpath('./staffs/staff')[0]
result = root.xpath('//staff[1]/name/text()') # 获取第一个员工的名字的内容
print(result) # ['小明']
result = root.xpath('//staff[position()<3]/name/text()') # 获取第1,2个员工的名字
print(result) # ['小明', '小花']
5.2 属性相关谓语
[@属性名=属性值] 获取指定属性是指定值的标签
[@属性名] 获取有指定属性的标签
staff = root.xpath('./staffs/staff')[0]
result = root.xpath('//staff[@id="s001"]/name/text()')
print(result) # ['小明']
result = root.xpath('//goods[@discount]/name/text()')
print(result) # ['泡面', '面包']
5.3 子标签内容相关谓语
根据子标签的内容来筛选标签
[子标签名>数据]、[子标签名>=数据]、[子标签名=数据]、
[子标签名<数据]、[子标签名<=>数据]
result = root.xpath('//goods[price=2]/name/text()')
print(result) # ['矿泉水']
6、通配符
写路径的时候用*
来表示虽有标签或者所有属性
result = root.xpath('//*[@id="s002"]/name/text()')
print(result) # ['小花']
result = root.xpath('/supermarket/@*')
print(result) # ['永辉超市', '肖家河大厦']
7、若干路径
路径1|路径2 同时获取路径1和路径2的内容
result=root.xpath('//goods/name/text()|//staff/position/text()')
print(result)
码字不易 点个赞再走吧