Python之HTML內容解析


1、引入

在Python的爬蟲項目中,通常需要解析獲取到的頁面內容,得到特定節點中的數據。所以需要解析工具,可以選擇:正則式,bs4,xpath等。在這里我們選擇使用Xpath對HTML內容解析

XPath,全稱XML Path Language,即XML路徑語言,可以在XML,HTML文檔中查找信息的語言,XPath的選擇功能十分強大,提供了非常簡明了的路徑選擇表達式。

xpath解析:最常用且最便捷高效的一種解析方式,也具有通用性。

xpath解析原理:

  1. 實例化一個etree的對象,把需要解析的頁面源碼數據加載到該對象中
  2. 調用etree對象中的xpath方法,結合xpath的表達式實現標簽定位和內容的捕獲

2、使用

安裝第三方庫 pip install lxml

引入etree對象:from lxml import  etree

加載HTML數據:

  1. 本地文件加載 etree.parse(file_url)
  2. 網絡資源加載  etree.HTML(html_text)      #requests.text

  返回的是一個對象,可以調用xpath方法

 

xpath表達式

在Chrome瀏覽器中,可以直接選擇節點,復制xpath表達式

  1. /:表示整個資源的根節點開始定位,表示的是一個層級
  2. //:表示多個層級,可以從任意位置開始
  3. 屬性定位://div[@class='attrName']     #定位到div標簽,且標簽class='attrName',
  4. 索引定位://div[@class='attrName']/p[2]  #div節點的下一級第二個p元素節點 ,索引定位是1開始
  5. 取值:/text()  #獲取標簽的直系文本內容     //text()獲取標簽下面所有節點的文本類容
  6. 取屬性值:/@attrName    #可以取對應節點下面的屬性值

 

import requests
from lxml import  etree
# 設置請求載體
headers = {
    # 在瀏覽器中,network查看
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
}

#讀取糗事百科的內容
def get_zhifu_rank():
    url='https://www.qiushibaike.com/'
    resqonse=requests.get(url,headers=headers)
    #獲取頁面資源
    page_text=resqonse.text

    #構造一個etree對象
    tree=etree.HTML(page_text)
    #xpath的表達式,得到想要的數據
    #在瀏覽器的開發者工具中預覽節點信息,在Chrome瀏覽器中可直接選擇節點,copy xpath表達式

    #從根節點開始,獲取body下面的直屬div,返回一個對象列表
    # res=tree.xpath('/html/body/div')
    #獲取根節點下面的,所有的div節點
    # res=tree.xpath('/html//div')
    #從根節點開始,通過索引的形式,獲取
    # res = tree.xpath('/ html / body / div[2] / div[1] / div[1]')
    #從根節點開始,通過屬性名稱獲取,如果屬性名唯一,則中間層可以直接 //表示
    #res = tree.xpath('/html//div[@class="index-head"]')
    # res = tree.xpath('/html//div[@id="index_header"]')

    #不從根節點開始查找
    #從任意節點開始查詢div,即查詢所有的div節點
    # res = tree.xpath('//div')    #res = tree.xpath('/html//div')
    #查看節點中class名字為index-head的div節點
    # res = tree.xpath('//div[@class="index-head"]')
    #查詢class=col0的div下面的所有li節點
    # res=tree.xpath('//div[@class="col0"]//li')
    #print(len(res),res)

    #取值
    #取出所有的div中直屬值 (不是div直屬的值不取)
    # res = tree.xpath('/html//div/text()')   #228個
    #取出div中的所有下級的值
    #res = tree.xpath('/html//div//text()')    #645個
    #res = tree.xpath('//div[@class="col0"]//li[3]//text()[0]')
    #你可以找到相應的節點,然后取值就好

    #取屬性值
    #取出class為col0的div下面的第三個li標簽中的a標簽直屬的href的屬性值
    # res = tree.xpath('//div[@class="col0"]//li[3]/a/@href')
    #標簽中的所有href值
    # res = tree.xpath('//div[@class="col0"]//li//@href')
    # print(len(res), res)

    #可以設置多個節點
    #得到li標簽的對象列表
    # li = tree.xpath('//div[@class="col0"]//li')
    #具體對象中的值,可以循環取值  ./表示在當前目錄下
    # res = li[2].xpath('./a/@href')
    # print(len(res), res)

具體示例:

 


免責聲明!

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



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