xpath超簡單入門教程

0. 背景:

1. 本文重點在於xpath在python爬蟲中的使用方法,有關概念性的所有問題將不會提及

2. 本文將涉及的python語法,HTML相關知識,requests庫的使用方法也不會做額外的說明

3. 本文只講述xpath的最簡單使用,其進階使用方法本文不做涉及(有機會在以後的文章中說)

1. 基礎知識:

1.1. 安裝

安裝xpath使用命令安裝即可

pip install lxmlii  /: 從當前節點直接選擇子節點

  //: 從當前節點選取子孫節點

  .: 選取當前節點

  ..:選取當前節點的父親節點

  @選取屬性

2. 在實際應用中學習:

這裡我們以B站排行榜為爬取對象進行學習(因為B站對爬蟲很友好).下面即是我們將要爬取的頁面.

2.0. 導入必要的庫 

import requests
from lxml import etree

2.1. 發起請求,獲取頁面數據:

url = 'https://www.bilibili.com/ranking'

try:
    res = requests.get(url)
    res.raise_for_status()
   res.encoding
= res.encoding if res.encoding == res.apparent_encoding else res.apparent_encoding src = res.text except: print('Check your code, please!!')

2.3. 頁面數據解析

使用etree對源碼進行解析,十分簡單,上面已經將獲得的源碼存入src,現在只需要將其傳遞給函數etree.HTML函數即可

html = etree.HTML(src)

如果是本地文件,則使用如下解析方式,只需要把path換成文件路徑即可

html = etree.parse('path', etree.HTMLParser())

2.4. 獲取特定數據

數據解析好了,現在需要提取數據.

1. 獲取頁面的標題:

title = html.xpath('/html/head/title/text()')

如果輸出title的值就是:  ['热门视频排行榜 - 哔哩哔哩 (゜-゜)つロ 干杯~-bilibili'] 

解釋:

  提取數據就是在xpath函數函數當中填入賽選條件(表達式),那麼這個表達式是什麼意思呢?我們先對照在1.2當中的內容發現:

  可以發現括號內的表達式應該是:

在當前頁面下搜索html節點,然後在html節點下面搜索head節點,接著在hrad節點下面搜索title節點,然後獲取它的內容
ps: text()是獲取文本的含義

是不是很簡單?不管你找什麼內容,知道知道它在文本中的什麼地方,都可以通過這種方式找到.

如果你覺得用眼睛看不過來,可以在瀏覽器中使用鼠標右鍵打開元素檢查(inspect),然後找到要找的標籤,並且鼠標右鍵單擊標籤,然後複製其xpath代碼,最後粘貼到括號當中即可.

 複製的結果:

/html/head/title

2. 提取所有熱門視屏的標題:

  

 我們先觀察一下,發現其實每一條視頻都對應著html中的一個li標籤,而這些標籤都有一個相同的class屬性.所以想要賽選出這些li標籤不一定非要像第一次那樣一層一層的往下找(雖然沒問題,但是會讓表達式冗長),我們可以通過class屬性來直接過濾.這也就是我們要學的東西,利用屬性進行篩選.

vtitile = html.xpath('//li[@class = "rank-item"]')

這樣我們就已經獲得了這些所有li標籤(裡可以輸出len(vtitile)查看li的個數,如果是100那麼就是正確的,如果不是少了說明有的標籤沒有取到,說明賽選條件不對,如果多了,說明篩選條件過寬,有些沒有被過濾掉--因為B站的熱門視屏是100個,所以才是100,其他情況見機行事),

現在我們已經取得這個這些標籤,那麼要怎麼獲取視屏的標題呢?我們將標籤展開來看:

 發現標題是在li標籤的一個a標籤中,這個a標籤還有一個名為target屬性,所以我們在上面的基礎上再次篩選:

vtitile = html.xpath('//li[@class = "rank-item"]//a[@target = "_blank"]/text()')

然後你輸出vtitile就能得到所有視屏的標題.

3. 獲取B站的關鍵字:

 如圖,B站的關鍵字都在一個名為keywords的meta標籤的content屬性中,所以我們這次只需要獲取這個屬性的內容即可.

  1. 我們先找到這個標籤,由於其層級高,所以直接使用絕對路徑搜索即可
  2. 由於有多個meta標籤,所以依舊需要使用屬性進行篩選
  3. 最後即可獲屬性
keyword = html.xpath('/html/head/meta[@name = "keywords"]/@content')

你只需要@你需要的屬性就能就能獲取的對應的值

3. 最後:

三個超級簡單的小案例,掌握xpath的2個基本作用:

  1. 獲取指定節點(標籤)的文本內容
  2. 獲取指定節點的屬性值

但是這樣已經能夠滿足你的絕大多數需求,想要深入學習可以自己找一些相關資料.

原文地址:https://www.cnblogs.com/ltozvxe/p/13639209.html