• python中xpath解析


    **前言:**今年博客更新的太少了,很多学习计划都因为工作原因延迟了,今年真的身心太疲惫了,终于有点能理解为什么有的同行们会无心学习了,今年同样也是吃老本的一篇博客,所谓好记性不如烂笔头,以前用的再熟的东西都会随着时间慢慢淡化掉。尤其是作为测试人员在面临不同的项目会让你用到不同的技术,在一个项目组待几年以前学过的东西很可能会忘个干净,这时间就体现出笔记的重要性了,哈哈哈,今天废话比较多啊,切入正题把。
    学过自动化测试或者爬虫的小伙伴们肯定对xpath再熟悉不过了,xpath呢其实就是在xml中搜索内容的一门语言,也是通用性比较强的一种解析方式。
    安装:

    pip instl lxml
    
    • 1

    实现方式:
    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对象,将需要解析的页面源代码放到对象中
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    从根节点开始定位获取项目名称:

    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)
    # 打印:['微信小程序开发商城定制生鲜配送外卖同城社交婚恋直播考试']
    
    • 1
    • 2
    • 3
    • 4

    获取某个标签内容:

    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']
    
    • 1
    • 2
    • 3
    • 4

    获取当前页面所有项目标题
    定位所有项目的父标签:
    在这里插入图片描述

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    打印:
    在这里插入图片描述

  • 相关阅读:
    Go Quiz: 从Go面试题看recover注意事项第1篇
    【Apollo】感知工程安装测试
    C++ 把类封装成静态链接库
    高速人工智能无人机首次击败世界冠军赛车手
    一文读懂 Redis 缓存系统
    机器学习-特征选择:如何使用交叉验证精准选择最优特征?
    【CSS】基础CSS样式属性
    翻译工具-翻译工具下载批量自动一键翻译免费
    江西农业大学择校分析(附23招生简章)
    内网渗透神器CobaltStrike之DNS Beacon(四)
  • 原文地址:https://blog.csdn.net/HUJIANLAILE/article/details/128166989