python爬蟲:XPath語法和使用示例
XPath(XML Path Language)是一門在XML文檔中查找信息的語言,能夠用來在XML文檔中對元素和屬性進行遍歷。html
選取節點
XPath使用路徑表達式來選取XML文檔中的節點或者節點集。這些路徑表達式和咱們在常規的電腦文件系統中看到的表達式很是類似。python
經常使用路徑表達式:
實例
在下面的表格中,列出一些路徑表達式以及表達式的結果:瀏覽器
查找特定的節點
注意點:在xpath中,第一個元素的位置是1,最後一個元素的位置是last(),倒數第二個是last()-1。python爬蟲
選取未知節點
XPath通配符可用來選取未知的XML元素。性能
選取若干路徑
經過在路徑表達式中使用"|"運算符,您能夠選取若干個路徑。url
實例
在下面的表格中,列出一些路徑表達式以及表達式的結果:spa
使用技巧
在通常的爬蟲實戰中,XPath路徑能夠經過谷歌瀏覽器或火狐瀏覽器中複製獲得,以下圖:3d
可是對於新手能夠多多嘗試本身寫XPath路徑,由於有時候複製獲取的XPath路徑過長,而本身寫的更簡潔些。code
例子:xml
import requests from lxml import etree headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36' } url = 'http://www.qiushibaike.com/text/' res = requests.get(url, headers=headers) selector = etree.HTML(res.text) id = selector.xpath('//div[@class="article block untagged mb15 typs_long"]/div[1]/a[2]/h2/text()') print(''.join(id).strip()) # 注意:經過/text()能夠獲取標籤中的文字信息。 # 結果爲:璃白°
幾種解析方式的性能對比
爬取豆瓣圖書TOP250
爬取的例子直接輸出到屏幕。
需求分析:
(1)要爬取的內容爲豆瓣圖書top250的信息,以下圖所示:
(2)所爬取的網頁連接: https://book.douban.com/top250?start=0 (3)須要爬取的信息有:書名,書本的連接,做者,出版社,出版日期評分和評價。
具體代碼以下:
# -*- encoding:utf8 -*- # 爬取豆瓣圖書TOP250。 import requests from lxml import etree # 請求頭,用來模擬瀏覽器 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36' } def get_info(url): res = requests.get(url, headers=headers).text # lxml庫的etree解析html selector = etree.HTML(res) # 獲取的是一頁中全部的書本信息,每本的因此信息都在類爲item的tr下面。 infos = selector.xpath("//tr[@class='item']") for info in infos: # 書名 name = info.xpath('td/div/a/@title')[0] # 書的連接地址 book_url = info.xpath('td/div/a/@href')[0] # 獲取的是書本的基本信息,有做者和出版社,和出版日期... book_infos = info.xpath('td/p/text()')[0] # 做者 author = book_infos.split('/')[0] # 出版社 publisher = book_infos.split('/')[-3] # 出版日期 date = book_infos.split('/')[-2] # 價格 price = book_infos.split('/')[-1] # 書本的評分 rate = info.xpath('td/div/span[2]/text()')[0] # 下面的評論 comments = info.xpath('td/p/span/text()') # 這裏單行的if語句是:若是comments的長度不爲0時,則把comments的第1個元素給comment,不然就把"空"賦值給comment comment = comments[0] if len(comments) != 0 else "空" print(name + " " + book_url + " " + book_infos + " " + author + " " + publisher + " " + date + " " + price + " " + rate + " " + comment) print() # 獲取下一頁的url if selector.xpath("//span[@class='next']/a"): next_pag = selector.xpath("//span[@class='next']/a/@href") get_info(''.join(next_pag)) if __name__ == "__main__": url = 'https://book.douban.com/top250' get_info(url)
部分結果以下圖所示:
來源:本文爲第三方轉載,若有侵權請聯繫小編刪除。