zoukankan      html  css  js  c++  java
  • 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. 獲取指定節點的屬性值

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

  • 相关阅读:
    超链接导航栏案例
    css中定位功能的特性
    background的使用
    数据库单表查询
    各种算法
    面向对象能做什么和特性及嵌套
    c3算法详解
    面向对象继承
    生成器
    迭代器
  • 原文地址:https://www.cnblogs.com/ltozvxe/p/13639209.html
Copyright © 2011-2022 走看看