1、引入
在Python的爬蟲項目中,通常需要解析獲取到的頁面內容,得到特定節點中的數據。所以需要解析工具,可以選擇:正則式,bs4,xpath等。在這里我們選擇使用Xpath對HTML內容解析
XPath,全稱XML Path Language,即XML路徑語言,可以在XML,HTML文檔中查找信息的語言,XPath的選擇功能十分強大,提供了非常簡明了的路徑選擇表達式。
xpath解析:最常用且最便捷高效的一種解析方式,也具有通用性。
xpath解析原理:
- 實例化一個etree的對象,把需要解析的頁面源碼數據加載到該對象中
- 調用etree對象中的xpath方法,結合xpath的表達式實現標簽定位和內容的捕獲
2、使用
安裝第三方庫 pip install lxml
引入etree對象:from lxml import etree
加載HTML數據:
- 本地文件加載 etree.parse(file_url)
- 網絡資源加載 etree.HTML(html_text) #requests.text
返回的是一個對象,可以調用xpath方法
xpath表達式
在Chrome瀏覽器中,可以直接選擇節點,復制xpath表達式
- /:表示整個資源的根節點開始定位,表示的是一個層級
- //:表示多個層級,可以從任意位置開始
- 屬性定位://div[@class='attrName'] #定位到div標簽,且標簽class='attrName',
- 索引定位://div[@class='attrName']/p[2] #div節點的下一級第二個p元素節點 ,索引定位是1開始
- 取值:/text() #獲取標簽的直系文本內容 //text()獲取標簽下面所有節點的文本類容
- 取屬性值:/@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)
具體示例: