文章目录

  • 爬虫之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)

码字不易 点个赞再走吧

python xpath爬取空_python