python爬虫-解析网页之lxml解析网页和自动化测试
使用lxml解析网页和自动化测试
1 使用lxml解析网页
lxml库结合libxml2快速强大的特性,使用xpath语法来进行文件格式解析,与Beautiful相比,效率更高
1.1 XPath
-
XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索
-
XPath使用XML、HTML文档数中的路径来选取节点或节点级
-
xpath解析原理:
-
实现标签的定位:实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
-
调用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
-
基本使用
- 引入lxml中的树结构
- 将字符串转化为Element对象[3],Element对象具有xpath的方法,返回结果的列表
- 把转化后的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(html).decode('utf-8') #把Element对象转换为字符串,并且以utf-8形式解码
2 Selenium
Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。
2.1 使用selenium前
-
安装selenium Python库
pip install selenium
-
安装浏览器驱动
- 例如:我使用的edge微软浏览器。edgedriver下载链接
- 注意:
- 下载的dviver要与浏览器版本相匹配
- driver包安装位置均可,推荐安装在Python根目录
- 注意:
- 例如:我使用的edge微软浏览器。edgedriver下载链接
-
配置driver环境变量
-
-
注意:
-
如果不配置环境变量,则需要在创建webdriver对象时指定对应driver.exe的路径
form selenium.webdriver import Edge driver01 = Edge(executable_path=r'D\Edgedriver.exe') #不配置环境变量 driver02 = Edge() #配置环境变量
-
测试可以使用下面代码进行测试
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() | 关闭所有窗口 |
注释:
XML是可扩展标记语言,主要用于传输和存储数据,他的焦点是数据的内容 ??
HTML是超文本标记语言,主要用于显示数据,他的焦点是数据的外观 ??
Element对象提供了HTML页面中所有元素所具有的属性和方法。所有的HTML元素都是HTNLElement对象,而这个对象继承于Element对象 ? ??
webdriver对象提供了各种驱动浏览器驱动的方法和属性 ??
将实际结果与预期进行比较的过程称为断言 ??