首页 > 技术文章 > python 爬虫-解析网页之 lxml 解析网页和自动化测试

handsome-black 2021-11-20 12:05 原文

使用lxml解析网页和自动化测试

1 使用lxml解析网页

lxml库结合libxml2快速强大的特性,使用xpath语法来进行文件格式解析,与Beautiful相比,效率更高

1.1 XPath

  • XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索

  • XPath使用XML、HTML文档数中的路径来选取节点或节点级

  • xpath解析原理:

    1. 实现标签的定位:实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。

    2. 调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。

1.1.1 XPath表达式

表达式 描述 例子 说明
nodename 选取此节点的所有子节点 body 获取body节点下所有子节点
/ 表示的是从根节点开始定位。表示的是一个层级。 1./body
2.body/head
1. 选取body节点
2. 选取body子元素的所有head元素
// 表示的是多个层级。可以表示从任意位置开始定位。 1. //body
2. body//div
1. 选取所有body子元素,无论在什么位置
2. 选取body元素后代的所有div元素,无论它们位于body什么位置
. 选取当前节点
.. 选取当前节点的父节点
@ 选取属性 @lang 选取名为lang的属性

2 lxml解析器

lxml是XML[1]和HTML[2]的解析器,其主要功能是解析和提取XML和HTML中的数据;是用C语言实现的,可以利用XPath语法,来定位特定的元素及节点信息

  • 安装lxml

    pip install lxml
    
  • 基本使用

    1. 引入lxml中的树结构
    2. 将字符串转化为Element对象[3],Element对象具有xpath的方法,返回结果的列表
    3. 把转化后的element对象转化为字符串,返回bytes类型结果 etree.tostring(element)
    • 例如:

      from lxml import etree  #引入lxml的树结构
      html = etree.HTML(text)  #将text转化为Element对象
      title_list = html.xpath('xpath字符串') #解析需求
      handeled_title_list = etree.tostring(title_list).decode('utf-8')  #把Element对象转换为字符串,并且以utf-8形式解码
      

2 Selenium

Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。

2.1 使用selenium前

  1. 安装selenium Python库

    pip install selenium
    
  2. 安装浏览器驱动

    • 例如:我使用的edge微软浏览器。edgedriver下载链接
      • 注意:
        1. 下载的dviver要与浏览器版本相匹配
        2. driver包安装位置均可,推荐安装在Python根目录
  3. 配置driver环境变量

      • 注意:

        1. 如果不配置环境变量,则需要在创建webdriver对象时指定对应driver.exe的路径

          form selenium.webdriver import Edge
          driver01 = Edge(executable_path=r'D\Edgedriver.exe') #不配置环境变量
          driver02 = Edge() #配置环境变量
          
        2. 测试可以使用下面代码进行测试

          form selenium.webdriver import Edge
          driver = Edge()
          

2.2 使用selenium

  • 创建webDriver对象[4]

    • 方法一:

      from selenium.webdriver import Edge  #引入Edge浏览器驱动
      driver = Edge() #创建webDriver对象。这里是编辑了环境变量的
      

      方法二:

      from selenium.Webdirver import Edge
      with Egde as driver:
          #你的代码
      

2.3 selenium方法

2.3.1 定位元素的八种方法

含义 定位单个元素 定位多个元素
通过元素id定位 find_element_by_id find_elements_by_id
通过元素name定位 find_element_by_name find_elements_by_name
通过xpath表达式定位 find_element_by_xpath find_elements_by_xpath
通过完整超连接定位 find_element_by_link_text find_elements_by_link_text
通过部分超链接定位 find_element_by_partial_link_text find_elements_by_partial_link_text
通过标签定位 find_element_by_tag_name find_elements_by_tag_name
通过类名定位 find_element_by_class_name find_elements_by_calss_name
通过css选择器进行定位 find_element_by_css_selector find_elements_by_css_selector
  • 演示(仅演示与定位有关代码):

    wD.find_element_by_id("kw")  #通过id定位
    wD.find_element_by_class_name("s_ipt") #通过类名定位
    
  • 拓展:webdriver中的By类

    • By是selenium中内置的一个class,在这个class中有各种方法来定位元素

    • 可用来解决代码可能删除线问题

    • 与常规写法的比较

      #常规
      from selenium.webdriver import Edge
      wD.find_element_by_id("kw")
      
      #引入By类
      from selenium.webdriver import Edge
      from selenium.webdriver,common.by import By
      wD.find_element(By.ID,"kw")
      

2.3.2 控制浏览操作的一些方法(常用,不全)

方法 说明
set_window_size() 设置浏览器大小
clear() 清除文本
click() 点击元素
text() 获取元素的文本
send_keys(value) 模拟按键输入value
submit() 提交表单

2.3.3 获取断言[5]信息

属性 说明
title 获取当前页面的标题
current_url 获取当前页面的url
text 获取搜索条目的文本信息

2.3.4 实现浏览器滚动条

因为webdriver没有提供实现浏览器滚动条相应操作方法,所以在这种情况下,我们就借助JavaScript来控制浏览器滚动条

  • 设置浏览器窗口滚动条的水平位置和垂直位置

    • 语法如下:

      window.scrollTO(左边距,右边距)
      
  • 滚动滚动条

    • 语法格式如下:

      execute_script(js代码)
      
    • js代码

      # 向下滚动
      js = 'var q=document.documentElement.scrollTop=10000'
      # 向上滚动
      js = 'var q=document.documentElement.scrollTop=0'
      # 向右滚动
      js = 'var q=document.documentElement.scrollLeft=10000'
      # 向上滚动
      js = 'var q=document.documentElemnt.scrollLeft=0'
      

2.3.5 关闭浏览器

方法 说明
close() 关闭单个窗口
quit() 关闭所有窗口

注释:


  1. XML是可扩展标记语言,主要用于传输和存储数据,他的焦点是数据的内容 ↩︎

  2. HTML是超文本标记语言,主要用于显示数据,他的焦点是数据的外观 ↩︎

  3. Element对象提供了HTML页面中所有元素所具有的属性和方法。所有的HTML元素都是HTNLElement对象,而这个对象继承于Element对象 ↩ ↩︎

  4. webdriver对象提供了各种驱动浏览器驱动的方法和属性 ↩︎

  5. 将实际结果与预期进行比较的过程称为断言 ↩︎

推荐阅读