python爬蟲之selenium--Xpath定位

2022-01-04 何三筆記
python爬蟲之selenium--Xpath定位前言

前面介紹過了七種定位方式,今天來介紹最後一種,也是最強大,本人最常用的定位方式xpath

Xpath 即為 xml 路徑語言,它是一種用來確定 xml 文檔中某部分位置的語言。Xpath 基於 xml 的樹狀結構,提供在數據結構樹中找尋節點的能力,html 也屬於 xml

先來看一個簡單的xpath定位

from selenium import webdriverfrom time import sleep
driver = webdriver.Chrome()driver.get('http://www.baidu.com')sleep(3)driver.find_element_by_xpath('//*[@id="kw"]').send_keys('selenium')# //表示當前頁面,@id="kw" 表示id為kw了sleep(2)driver.find_element_by_xpath('//*[@id="su"]').click()sleep(2)
driver.quit()

看起來是不是比較麻煩,為什麼不通過id直接定位,因為在前端網頁開發中,不是每個元素都有id屬性的,或者id值是動態變化的。不能直接通過id定位,就要用到xpath定位了

被測網頁HTML代碼如下:

python爬蟲之selenium--Xpath定位XPath絕對路徑定位

查找第一個div標籤下的「查詢」按鈕

driver.find_element_by_xpath('/html/body/div/inpu[@value="查詢"]')

XPath相對路徑定位

查找第一個div標籤下的「查詢」按鈕

driver.find_element_by_xpath('//input[@value="查詢"]')

//表示從匹配選擇的當前節點開始選擇文檔中的節點,定位到value值為查詢的input頁面,使用@表明後面接的是屬性

使用索引號定位元素

查找第一個div標籤下的「查詢」按鈕

driver.find_element_by_xpath('//input[2]')

定位到第二個input標籤,從1開始

使用頁面元素的屬性值定位元素

定位被測試網頁中的第一張img元素

//img[@href='http://www.baidu.com']//input[@type='button']

使用模糊屬性值定位元素

頁面上某些元素的屬性值是動態生成的,也就是說每次訪問的屬性值都不一樣,使用模糊屬性值可以解決一部分此類問題,前提是屬性中有一部分內容保持不變

查找屬性alt的屬性值以「div1」關鍵字開始的頁面元素

//img[starts-with(@alt,'div1')]

查找alt屬性的屬性值包含「img」關鍵字的頁面元素,只要包含即可,無須考慮位置

//img[contains(@alt,'img')]

實例:python爬蟲之selenium--Xpath定位

上面頁面中id值中後面的數字是動態變化的

fr = driver.find_element_by_xpath("//iframe[contains(@id,'x-URS-iframe')]")  driver.switch_to.frame(fr)

使用XPath軸(Axes)定位元素

先找到一個相對好定位的元素,讓他作為軸,根據他和要定位的相對位置關係進行定位

XPath軸關鍵字軸的含義說明定位表達式實例表達式解釋parent選擇當前節點的上層父節點//img[@alt='div2-img2']/parent::div查找到屬性alt的屬性值為div2-img2的img元素並基於該img元素的位置找到他上一級的div元素child選擇當前節點的下層所有子節點//div[@id='div1']/child::img查找到id屬性值為div1的div元素,並基於該div元素的位置找到他下層節點中的img元素ancestor選擇當前節點所有上層的節點//img[@alt='div2-img2']/ancestor::div查找到屬性alt的屬性值為div2-img2的img元素並基於該img元素的位置找到他上一級的div元素descendant選擇當前節點所有下層的節點(子,孫等)//div[@name='div2']descendant::img查找到屬性name的屬性值為div2的div元素並基於該元素的位置找到他下級所有節點中的img頁面元素following選擇在當前節點之後顯示的所有節點//div[@id='div1']/following::img查找到id屬性值為div1的div元素,並基於該div元素的位置找到他後面節點中的img元素following-sibling選擇當前節點後續所有兄弟節點//a[@href='http://www.sogou.com']/following-sibling::input並基於連結的位置找到它後續兄弟節點中的input頁面元素preceding選擇當前節點前面的所有節點//img[@alt='div2-img2']/preceding::div查找到屬性alt的屬性值為div2-img2的圖片元素img,並基於該圖片元素的位置找到他前面節點中的div頁面元素preceding-sibling選擇當前節點前面的所有兄弟節點//input[@value='查詢']/preceding-sibling::a[1]查找到value屬性值為「查詢」的輸入框頁面元素,並基於該輸入框的位置找到它前面同級節點中的第一個連結元素

有時候我們會在軸後面加一個星號(

),表示通配符,比如//input[@value='查詢']/preceding-sibling::

,它表示查找屬性value的值為「查詢」的輸入框input元素前面所有的同級元素,但不包括input元素本身

使用頁面元素的文本定位元素

通過text()函數可以定位到元素文本包含某些關鍵字的頁面元素

(1) //a[text()='搜狗搜索'](2) //a[.='搜狗搜索'](3) //a[contain(.,"百度")](4) //a[contain(text(),"百度")](5) //a[contain(text(),"百度")]/preceding::div(6) //a[contain(.,"百度")]/..

pytho定位語句

driver.find_element_by_xpath("//a[text()='搜狗搜索']")
driver.find_element_by_xpath('//a[contain(text(),"百度")]/preceding::div')

表達式1和表達式2等價,都是查找文本內容為「搜狗搜索」的連結頁面元素,使用的是精準定位,不能多也不能少

表達式3和表達式4等價,都是查找文本內容裡包含「百度」關鍵字的連結頁面,使用的是模糊匹配

表達式5和表達式6等價,都是查找文本內容裡包含「百度」關鍵字的連結頁面元素a的上層父元素div,表達式6最後使用了兩個點,它表示選取當前節點的父節點,等價於preceding::div

xpath定位實例

實例一

python爬蟲之selenium--Xpath定位

先定位到name='wd'的標籤上,..返回父級標籤,也就是span標籤,在找到span標籤的a標籤

實例二

python爬蟲之selenium--Xpath定位
//*[contains(@id,"cjm_dialog")]/div/div[2]/button[1]/span

實例三

python爬蟲之selenium--Xpath定位
//div[@class="hidden-columns"]/following-sibling::div[4]/div/table/tbody/tr[1]/td[12]/div/button[5]/span

實例四

python爬蟲之selenium--Xpath定位
//span[@class='el-input__suffix']/preceding-sibling::input[1]

實例五

python爬蟲之selenium--Xpath定位
//div[text()="溯源節點"]/../div/button/span/i

實例六

python爬蟲之selenium--Xpath定位
//label[text()="選項名稱"]/following::div/div/input

實例七

python爬蟲之selenium--Xpath定位
//label[contains(text(),"單選1")]/following-sibling::div/div/div/input

實例八

python爬蟲之selenium--Xpath定位
//span[text()="所屬機構"]/../following-sibling::div/span/input

相關焦點

  • Python+Selenium,讓瀏覽器自動幫你下文獻
    這麼簡單的流程,為啥不能交給電腦呢?點擊下載按鈕,實質上就是打開下載連結,那麼我們可以將上述過程簡化為兩步:1.獲取所有下載連結;2.分別點擊每一個下載連結進行下載。三、編程實現1、Python編程需要選擇一種程式語言,這裡我選擇的語言是簡單、容易上手的Python,本文所有代碼均為Python。
  • selenium + python 中文文檔
    通過Selenium Python的API,你可以直觀地使用所有的 Selenium WebDriver 功能Selenium Python提供了一個很方便的接口來驅動 Selenium WebDriver ,例如 Firefox、Chrome、Ie,以及Remote ,目前支持的python版本有2.7, 3.2, 3.3 和 3.4.
  • 如何用一行代碼讓 gevent 爬蟲提速 100%
    用python做網絡開發的人估計都聽說過gevent這個庫,gevent是一個第三方的python協程庫,其是在微線程庫greenlet的基礎上構建而成,並且使用了epoll事件監聽機制,這讓gevent具有很好的性能並且比greenlet更好用。
  • Python爬蟲教程使用Scrapy框架爬取小說代碼示例
    scrapy genspider example example.com    其中example是我們爬蟲名,example.com是爬蟲爬取的範圍,也就是網站的域名。創建Spider爬蟲在上面的步驟我們成功創建了一個Scrapy項目,而且知道如何創建Spider爬蟲,接下來我們創建名為fiction的Spider爬蟲,其域名為www.17k.com,代碼如下所示:
  • selenium+python自動化78-autoit參數化與批量上傳
    代碼執行```python# 需上傳圖片的路徑file_path = "D:\\1.png"# 執行autoit上傳文件os.system("C:\Users\Gloria\Desktop\cmdjpg.exe %s" % file_path)  # 你自己本地的```二、批量上傳圖片1.
  • Scrapy實戰5:Xpath實戰訓練
    系列文章Scrapy實戰4:初識爬蟲框架ScrapyScrapy實戰3:URL去重策略Scrapy實戰2:爬蟲深度&&廣度優先算法Scrapy實戰1| 正則表達式    今天給大家分享的是,如何在cmd和pycharm中啟動自己的spider以及Xpath的基本介紹,並利用Xpath
  • 介紹一款能取代 Scrapy 的爬蟲框架 - feapder
    前言Python 最流行的爬蟲框架是 Scrapy,它主要用於爬取網站結構性數據今天推薦一款更加簡單、輕量級,且功能強大的爬蟲框架:feapder項目地址:https://github.com/Boris-code/feapder2.
  • 教你一招,讓 Selenium 在 Linux 中以有頭模式運行
    爬蟲使用 Selenium 與 Puppeteer 能被網站探測的幾十個特徵通過他我們可以發現,在不做任何設置的情況下,Selenium 或者 Puppeteer 啟動的瀏覽器有幾十個特徵能夠被目標網站識別為爬蟲,並且無頭模式的特徵比有頭模式的特徵多得多也就是說,即使你不使用任何隱藏特徵的技術
  • 13-python爬蟲之JSON操作
    Json模塊提供了四個功能:dumps、dump、loads、load,用於字符串 和 python數據類型間進行轉換https://docs.python.org/zh-cn/3/library/json.htmlhttp://tool.oschina.net/codeformat/json1. json.loads()實現:json字符串
  • Python協程爬蟲,gevent獲取網頁源碼列印pdf實例爬蟲
    Python協程爬蟲的一個簡單實例demo,使用了隊列來進行數據的傳遞,協程的使用相比單線程會快,感覺在加大協程線的時候,速度並沒有相應的加快,或者說佔用的時間並沒有想像中的少,可以參照使用,僅供參考和學習使用!
  • 爬蟲技術實戰
    》介紹了爬蟲的基本技術,分享了一個動態爬蟲demo。可以看出來,聚焦爬蟲和非聚焦爬蟲都是從www.wooyun.org開始爬取,聚焦爬蟲可以按照一定策略儘量控制URL爬取策略,而非聚焦爬蟲卻完成不了這種特定需求。
  • Python爬蟲系列:BeautifulSoup庫詳解
    人們從來都無法以絕對的自我之相存在,每一個人都在努力變成絕對自我,有人遲鈍,有人更洞明,但無一不是自己的方式。人人都背負著誕生之時的殘餘,背負著來自原初世界的黏液和蛋殼,直到生命的終點。-《德米安 彷徨少年時》之前了解過Requests庫的用法,在Python爬蟲中,用到BeautifulSoup4庫的技術路線為Requests庫+BeautifulSoup4庫+re庫,這裡小編準備先聊聊Beautiful Soup4庫。
  • Python爬蟲超詳細講解(零基礎入門,老年人都看的懂)
    講解我們的爬蟲之前,先概述關於爬蟲的簡單概念(畢竟是零基礎教程)爬蟲網絡爬蟲(又被稱為網頁蜘蛛,網絡機器人)就是模擬瀏覽器發送網絡請求,接收請求響應,一種按照一定的規則,自動地抓取網際網路信息的程序。原則上,只要是瀏覽器(客戶端)能做的事情,爬蟲都能夠做。
  • Python爬蟲從入門到精通(2): requests庫詳解,cookie操作與實戰
    在Python爬蟲從入門到精通(1): 爬蟲原理, urllib庫介紹及5個適合新手練手的爬蟲我們已經介紹了urllib庫用法的用法,比如當我們需要向一個url發送get參數或post數據時,我們先要對參數或數據進行urlencode編碼,再用urllib.request.Request方法構建一個request_url對象加入參數和數據,最後使用request.urlopen方法打開構建好的request_url
  • 小白爬蟲第二彈之健壯的小爬蟲
    cuiqingcai.com/3256.html(點擊尾部閱讀原文前往)轉載請註明:靜覓 » 小白爬蟲第二彈之健壯的小爬蟲上次教大家寫了一個下載www.mzitu.com全站圖片的小爬蟲練手、不知道大家消化得怎麼樣?《小白爬蟲第一彈之抓取妹子圖》大家在使用的時候會發現,跑著跑著 就斷掉了!報錯了啊!丟失連接之類的。倖幸苦苦的抓了半天又得從頭來,心累啊!這就是網站的反爬蟲在起作用了,一個IP訪問次數過於頻繁就先將這個IP加入黑名單,過一會兒再放出來。
  • 超詳細的Python實現新浪微博模擬登陸
    通過查找可以看到關鍵加密代碼:password = RSAKey.encrypt([me.servertime,me.nonce].join("t") "n" password)這一段代碼便是加密密碼的代碼,有經驗的同學一看就知道是用的 RSA 加密,python 中也有相應的 rsa 加密庫可用。
  • 基於源碼編譯安裝python3並且移植pip3安裝模塊到不可上網機器的操作步驟
    /bin/python3.9 -m pip install --upgrade pip離線安裝部分whl文件/python3bin/bin/pip3 installselenium-3.141.0-py2.py3-none-any.whl查看安裝效果:/python3bin/bin/pip3 listPackage   Version