首頁>技術>

python中使用xpath的場景

  我們一般是在爬蟲中會用到xpath對網頁原始碼進行資訊的篩選與提取,具體而言,主要篩選的資訊有以下幾種:  1,某個標籤中文字的獲取    eg:<title>my love</title> 中my love的獲取  2,某個標籤中屬性的獲取    eg:<title class=“beautiful”>my love</title> 中class屬性的獲取

html文件結構的分析

 整個網頁其實可以看作是一個大方塊套著各式各樣的小方塊,每個方塊中可以嵌入文字,圖片等東西。以bing搜尋網頁為例,如下圖:最大的一個網頁的方塊,

其中又有搜尋框方塊、頁首方塊、

而搜尋框方塊中又包含了一個搜尋圖示的方塊。

在html(超文字標記語言)中,這些方塊就用標籤來表示,而方塊的包含關係,也就形成了標籤的包含關係(父子關係),並列關係(兄弟關係)。每個方塊又要指定固定的自己的樣式,於是就有各種屬性被包含在標籤中。

<!DOCTYPE HTML><html><body>        #兩個尖括號括起來為一個標籤 如  <body></body>  <title>  a book  </title>  <ol>  The truth about elk.   </ol>  <ol>    <li class="a">An elk is a smart   #標籤中的額外東西為屬性 如  class="a"        	<span>starfish</span>	</li>    <li>...and cunning animal!</li>  </ol></body></html>

如以上html文件可以轉換成以下dom樹

程式碼操作

利用lxml可以將標籤關係變成一個樹的形式,來體現標籤的關係以便查詢所以先匯入模組:

from lxml import html

將網頁原始碼解析成樹的dom樹的形式:

tree=html.fromstring(r_text)  #r_text為requests請求後的網頁原始碼

之後我們便是對dom樹利用xpath語法進行我們所需要搜尋的節點

tree.xpath('xpath')   #xpath為所寫的xpath路徑
xpath最常用的講解

 最開始的目的中講了我們的目的是獲得一個節點中的文字或者是屬性,所以我們的問題有兩個:

如何定位我們所要找的節點找到節點後如何獲取屬性和文字如何定位我們所要找的節點
//li     #選取所有的li節點          # ‘//’為選取所有的運算子//li[0]    #選取所有的li節點中的第一個節點//li[@class="a"]    #選取所有帶有屬性class=“a”的li節點//li[@class="a"] /span  #選取所有帶有屬性class=“a”的li節點下的span節點
找到節點後如何獲取屬性和文字
//li[0]/@class  #選取所有的li節點中的第一個節點並獲得其class屬性的值    #‘/@’為獲取其屬性運算子//li[@class="a"] /span/text()  #選取所有帶有屬性class=“a”的li節點下的span節點,並獲取其中的文字 # ‘/text()’為獲取文字的運算子
騷操作大法

 但其實我們在實際操中使用的最廣泛的方法為

點選f12檢視網頁原始碼點選該箭頭(元素選擇器)在網頁中找到我們所需要搜尋的元素並點選此時原始碼展示處會自動定位到我們所選的標籤處copy其xpath並 進行適當修正後進行操作(不稍稍修正可能達不到你的目的呦)(但其實有時候特徵很明顯的時候自己寫反而會更簡單)實戰 爬取豆瓣電影top250第一頁電影的引言

程式碼如下很easy:

import requestsfrom lxml import htmlheaders = {    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'}url = 'https://movie.douban.com/top250'r = requests.get(url, headers=headers)tree = html.fromstring(r.text)# copy的xpath# quotes_a=[]# quotes_a.append(tree.xpath('//*[@id="content"]/div/div[1]/ol//li/div/div[2]/div[2]/p[2]/span/text()'))# print(quotes_a)# 自己寫的xpathquotes_b = []      #建立引言的列表quotes_b.append(tree.xpath('//span[@class="inq"]/text()'))print(quotes_b)
更深入的學習

xpath教程:https://www.w3school.com.cn/xpath/index.asphtml教程:https://www.w3school.com.cn/html/index.asp

14
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 複雜系統如何保障程式碼質量?讓測試先行