xpath

1.1Xpath介绍

  • xpath是一种XML解析语言(我们熟悉的HTML其实是XML的一个子集),它提供了100多个内建函数。
  • 几乎所有的语言都能使用xpath进行数据解析
  • 其他XML解析语言:Beautifulsoup,lxml,DOM,SAX,JSDOM…

与其他爬虫解析技术相比:

提取技术速度难易程度
Xpath中等
re最快困难
bs4容易

1.2Xpath语法

  • 层级:

    表达式意义eg说明
    //从全局选取节点,只要符合,任意位置都可//div选取html页面中的所有div节点
    /选取某个节点下的子节点//head/title选取head下的title节点
    .选取当前节点./a选取当前节点下的所有a标签
  • 属性:

    表达式意义eg说明
    @选取符合属性的节点//div[@id];//div[@id=‘1’]选取带有id属性的所有div节点;选取属性id值为1的所有div节点
    //@选取属性//@lang选取所有名为lang的所有属性
  • 通配符:

    表达式意义eg说明
    *选取任意节点//div[@id=‘1’]/*选取id为1的div节点下的所有节点
    |相当于或与和的意义//div|//meta选取所有的div节点和所有的meta节点,只要满足其中一个都会被选取
    [@*]选取带有属性的节点//a[@*]选取所有带有属性的a标签节点
  • 函数(常用):

    表达式意义eg说明
    position()筛选节点//head/meta[position()< 3]选取所有head节点下的前两个节点
    last()选取最后一个节点//head/meta[last()]选取所有head节点下的最后一个meta节点
    [k]选取第k个节点//head/meta[k]选取所有head节点下的第k个节点
    contains()选取节点属性中包含某内容的节点//div[contains(@id,‘in’)]选择属性id中包包含’in’的所有div节点
    starts-with()选取属性值开头为某内容的节点//div[starts-with(@id,‘in’)]选择属性id开头为’in‘的所有div节点

    注意:在xpath中,标签的下标从1开始,与我们所学编程语言中如数组,列表等下标从0开始不一样,所以当我们用xpath选取第k个节点为[k]

1.3Xpath实战(python爬虫)

此处以4399小游戏为例:

准备工作:

  1. 安装lxml库(我们需要使用到lxml中的etree模块):

    pip3 install lxml
    
  2. 导入lxml库的etree模块:

    from lxml import etree
    
  3. 访问4399并取得该html页面:

    import requests
    url = 'https://www.4399.com/'
    res = requests.get(url)
    #4399html中编码格式为gb2312.而requests中取得的html编码格式默认为utf-8
    res.encoding = 'gb2312'
    html = res.text
    
  4. 调用HTML类对HTML文本进行初始化,成功构造XPath解析对象,同时可以自动修正HMTL文本(标签缺少闭合时会自动添加上):

    html = etree.HTML(html)
    
  5. 数据提取:

在这里插入图片描述

我们先按下F12出现调试界面,按住ctrl+shift+c选择页面中我们需要提取元素,此时将跳转至该元素的节点位置,我们按下ctrl+F出现搜索框,我们在此搜索框内输入节点的xpath进行测试是否正确:
在这里插入图片描述

在确定好节点元素的xpath后在我们的python中进行数据提取:
list = []
lis = html.xpath('//div[@class="box_c"]/div[2]/ul/*')
for li in lis:
    name = li.xpath('./a/text()')
    list.append(name[0])
print(list)

注意:在上方python代码中,name即li.xpath返回值为一个列表

  1. 输出结果
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值