xpath全稱為xml path language一種小型的查詢語言,在爬蟲中,我們其實就是拿它來搜尋html文件,僅此而已。而網頁內容只有通過解析才能進行搜尋,所以使用xpath時,需要引入lxml庫,這個庫就是來解析網頁,協助xpath進行搜尋的。
lxml庫的安裝,可以直接使用`pip3 install lxml`進行安裝。如果沒有錯誤資訊說明安裝成功了;如果出現錯誤,比如缺少libxml2等庫,可以使用wheel檔案離線安裝。
用lxml解析網頁
from lxml import etree
import requests
from lxml.html import fromstring, tostring
url = ''
res = requests.get(url,headers=headers)
tree = etree.html(res.text)
print(tree)
以上**的執行結果是:「」 。這種是乙個列表,如果要轉成可以讀懂的html格式,可以用下面的**,詳細原因可檢視部落格:《xpath解析中的 'element a at 0x5308a80'是什麼》,這裡不贅述。
from lxml import html
from html.parser import htmlparser
#轉為string
tree1 = html.tostring(tree[0])
#編碼'utf-8'
tree2 = htmlparser().unescape(tree1.decode('utf-8'))
print(tree2)
分類
符號說明
例項結果
表示式nodename
選擇這個節點名的所有子節點
.xpath('//li')
表示選取所有的li節點
/從當前節點擊擇直接子節點
.xpath('//ul/li')
表示先選取所有ul節點,再選取ul節點下的直接子節點li
//從當前節點擊取子孫節點
.xpath('//li')
表示選取所有的li節點
.選擇當前節點--
…選取當前節點的父節點--
@選取屬性
.xpath('//ul/li/../@class')
獲取li節點下的class屬性
text()
選取文字
.xpath('//ul/li/../text()')
獲取li節點下的文字值
軸ancestor
選取當前節點的所有先輩節點
.xpath('//li/ancestor::*')
表示獲取li節點的所有先輩節點
ancestor-or-self
選取當前節點的所有父輩及當前節點本身
.xpath('//li[1]/ancestor-or-self::*')
表示獲取li節點的所有先輩節點及當前節點本身
attribute
選取當前節點的所有屬性
.xpath('//li[1]/attribute::name')
獲取當前節點的所有name屬性
child
選取當前節點的所有直接子元素
.xpath('//ul/child::*')
選擇ul節點的所有直接子節點
descendant
選取當前節點的所有後代節點
.xpath('//ul/descendant::a')
選擇ul節點的所有a節點
descendant-or-self
選取當前節點的所有後代節點及當前節點本身
.xpath('//ul/descendant-or-self::a')
選擇ul節點的所有a節點及當前節點本身
following
選取當前節點的結束標籤後的所有節點
.xpath('//li[3]/following::*')
選擇第三個li節點後的所有節點
following-sibling
選取當前節點之後的所有同級節點
.xpath('//li[1]/following-sibling::*')
選擇第乙個li節點後的所有同級節點
namespace
選取當前節點的所有命名空間節點--
parent
選取當前節點的父節點
.xpath('//li/parent::*')
選取當前節點的父節點
preceding
選取當前節點的開始標籤之前的所有同級節點機同級節點下的節點
.xpath('//li[3]/preceding::*')
選擇第三個li節點前的所有同級節點及同級節點下的子節點
preceding-sibling
選取當前節點之前的所有同級節點
.xpath('//li[2]/preceding-sibling::*')
選擇第二個li節點前的所有同級節點
self
選取當前節點
.xpath('//li[3]/self::*')
選取當前節點
如下圖,以鏈家網為例。現在要取出乙個頁面中所有房屋銷售標題(即中的『園西 單價3.7萬 目前小區相對低的一套 近地』這部分資訊),分析html檔案可知,該列表資訊在body下,id="content"的第乙個標籤是div節點下,第乙個ul標籤節點下。。。。(後面的分析同理,自己開啟網頁的html文件
慢慢分析,最終**及結果如下)
#//*[@id="content"]/div[1] 表示取當前節點「body」下,選擇所有id="content"的節點,取出標籤是div的第乙個節點
#/ul 表示取第乙個div節點下所有標籤是ul的直接子節點
#/li 同上,不贅述
#/div[1] 表示取li節點下標籤是div的第乙個直接子節點
#/a 表示取第乙個div節點下的所有標籤是a的直接子節點
#text() 表示取a標籤節點下的文字內容
看完上面的例子,是不是覺得如果這樣取資料,分分鐘把自己逼瘋了,然而現實中,有一些快捷方式可以幫我們很快取出正確的路徑,如瀏覽器chrome的外掛程式xpath helper,或直接在chrome瀏覽器對應的網頁html中,定位到相應的位置,右鍵copy--copy xpath 即可,我比較懶,連外掛程式都不想裝,所以一般都是用第二種。
如下圖,在網頁上定位到第乙個標題的位置,通過copy xpath,把第乙個路徑複製出來
(//*[@id="content"]/div[1]/ul/li[1]/div[1]/div[1]/a),再結合前面學習的規則,簡單改一下,就ok 了。
Python爬蟲之Xpath解析
例項化乙個etree物件,且需要將被解析的頁面的原始碼資料載入到該物件中 呼叫etree物件中的xpath方法結合著xpath表示式實現標籤的定位和內容的捕獲 pip install lxmlfrom lxml import etree1 將本地的html檔案中的原始碼載入到etree物件中 etr...
python爬蟲 用xpath爬豆瓣電影
步驟 將目標 下的頁面抓取下來 將抓取下來的資料根據一定規則進行提取 具體流程 將目標 下的頁面抓取下來 1.倒庫 import requests2.頭資訊 有時候可不寫 4.返回響應 response requests.get url,headers headers 響應 print respon...
Python之爬蟲 etree和XPath實戰
下面 是在 上找到的乙個例子,空閒的時候可以自己除錯。coding utf 8 爬蟲 創業邦 創業公司資訊爬取 網頁url 爬取頁面中的創業公司,融資階段,創業領域,成立時間和創業公司的鏈結資訊。使用到requests,json,codecs,lxml等庫 requests用於訪問頁面,獲取頁面的源...