使用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(title_list).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() | 關閉所有窗口 |
注釋: