python 爬蟲-解析網頁之 lxml 解析網頁和自動化測試


使用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. 將實際結果與預期進行比較的過程稱為斷言 ↩︎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM