目錄
一、Xpath插件的安裝
二、安裝 lxml
三、Xpath解析文件
1.解析本地文件
(1)導入本地文件
(2)解析本地文件
2.服務器文件解析
(1)獲取網頁源碼
(2)解析服務器響應文件
四、Xpath-抓取圖片
1.設置url
2.請求對象定制
3.獲取網頁源碼
?4.下載圖片
5.調用
參考
Xpath可以解析兩種文件
- etree.parse() 解析本地文件:html_tree = etree.parse( 'xx.html')
- etree.HTML()服務器響應文件:html_tree = etree.HTML(response.read( ).decode( utf-8")
Xpath基本語法
html_tree.xpath(xpath路經)
1.路徑查詢
????????//: 查找所有子孫節點,不考慮層級關系(子和孫所有節點)
????????/: 找直接子節點
2.謂詞查詢
????????//div[@id]
????????//div[@id="maincontent"]
3.屬性查詢
????????//div/@class
4.模湖查詢
????????//div[contains(@id,"he")]
????????//div[starts-with(@id,"he")]
5.內容查詢
????????//div/h1/text()
6.邏輯運算
????????//div[@id="head” and @class="s_down"]
????????//title | //price
一、Xpath插件的安裝
進入chrome應用商店
搜索 Xpath helpler?
選擇這個安裝?
怎么看擴展是否安裝成功呢?
隨便打開一個頁面,然后 按快捷鍵 Ctrl+Shift+X
出現這個黑色的框框就算安裝成功了
二、安裝 lxml
在環境中
pip install lxml
三、Xpath解析文件
1.解析本地文件
(1)導入本地文件
from lxml import etree# Xpath解析有兩種解析文件
# 1.本地文件 etree.parse( 'xx.html')
# 2.服務器相應數據 response.read().decode('utf-8') 【主要用這個】 etree.HTML(response.read( ).decode("utf-8")tree = etree.parse('_070.html')
print(tree)
報錯:
?需要將本地文件中的meta加一個結束標簽
然后重新運行就可以了
(2)解析本地文件
本地的 HTML 文件?
內容查詢
# text() 獲取標簽中的內容
# 路徑查詢
# 查找 ul 下面的 li
# li_list = tree.xpath('//body/ul/li')
li_list = tree.xpath('//body/ul/li/text()')
print(li_list)
?不用內容查詢
使用內容查詢
路徑查詢
# text() 獲取標簽中的內容
# 路徑查詢
# 查找 ul 下面的 li
li_list = tree.xpath('//body/ul/li/text()')
print(li_list)
謂詞查詢
# 謂詞查詢
# 查找所有有id屬性的 <li> 標簽
li_list = tree.xpath('//ul/li[@id]/text()')
print(li_list)
# 謂詞查詢
# 查找id為 ‘l1’ 的 <li> 標簽
li_list = tree.xpath('//ul/li[@id="l1"]/text()')
print(li_list)
屬性查詢
# 屬性查詢
# 查詢<li>標簽的class屬性的屬性值
li_list = tree.xpath('//ul/li/@class')
print(li_list)
# 查詢id 為 ‘l1’ 的<li>標簽的class屬性的屬性值
li_list = tree.xpath('//ul/li[@id="l1"]/@class')
print(li_list)
模糊查詢
# 模糊查詢
# 查找 <li> 標簽的id中包含 ‘l’ 的標簽
li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()')
print(li_list)
# 查找 <li> 標簽的id中以‘s’開頭的標簽
li_list = tree.xpath('//ul/li[starts-with(@id,"s")]/text()')
print(li_list)
邏輯查詢
# 邏輯運算
# 查詢<li>標簽中id為‘l1’且class的屬性值為‘c1’的標簽
li_list = tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')
print(li_list)
# 查詢<li>標簽中id為‘s1’或者class為‘c1’的標簽
li_list = tree.xpath('//ul/li[@id="s1"]/text() | //ul/li[@class="c1"]/text()')
print(li_list)
2.服務器文件解析
(1)獲取網頁源碼
# 1.獲取網頁的源碼
url = 'https://www.baidu.com/'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}
# 請求對象定制
request = urllib.request.Request(url, headers=headers)
# 模擬客戶端向服務器發送請求
response = urllib.request.urlopen(request)
# 獲取網頁源碼
content = response.read().decode('utf-8')
print(content)
(2)解析服務器響應文件
# 解析服務器響應的文件
tree = etree.HTML(content)
我們應該如何獲取Xpath呢?
之前安裝的Xpath擴展就起作用了
我們 Ctrl + Shift + X打開擴展
右鍵頁面打開檢查,定位到“百度一下” 【我們要想要獲取“百度一下”這個字段】
然后我們就可以根據檢查中html標簽的描述,在黑色框的左側寫 查詢代碼,右側則顯示查詢結果,查詢正確時,右側框中則會出現你想要的東西,我們復制這個Xpath路徑。
將復制的Xpath路徑填入代碼,運行就可以看到,我們已經成功獲取了“百度一下這個字段”
# 打印
result= tree.xpath('//input[@id="su"]/@value')
print(result)
還有一種獲取Xpath的方法
右鍵網頁,點擊檢查,點擊箭頭,然后選中頁面中“百度一下”這個框,檢查中就會點位到這個框的位置,然后右鍵這個位置,選擇copy,選擇copy Xpath,就會得到一個定位到百度一下這個框的代碼? //*[@id="su"]
然后補充自己想要獲取的值(@value)就可以
result = tree.xpath('//*[@id="su"]/@value')
print(result)
本地文件解析完整代碼:
from lxml import etree# Xpath解析有兩種解析文件
# 1.本地文件 etree.parse( 'xx.html')
# 2.服務器相應數據 response.read().decode('utf-8') 【主要用這個】 etree.HTML(response.read( ).decode("utf-8")##############################
######## 本地文件解析 ########
#############################
# 導入 本地html文件
tree = etree.parse('_070.html')# text() 獲取標簽中的內容
# 路徑查詢
# 查找 ul 下面的 li
# li_list = tree.xpath('//body/ul/li/text()')# 謂詞查詢
# 查找所有有id屬性的 <li> 標簽
# li_list = tree.xpath('//ul/li[@id]/text()')
# 查找id為 ‘l1’ 的 <li> 標簽
# li_list = tree.xpath('//ul/li[@id="l1"]/text()')# 屬性查詢
# 查詢<li>標簽的class屬性的屬性值
# li_list = tree.xpath('//ul/li/@class')
# 查詢id 為 ‘l1’ 的<li>標簽的class屬性的屬性值
# li_list = tree.xpath('//ul/li[@id="l1"]/@class')# 模糊查詢
# 查找 <li> 標簽的id中包含 ‘l’ 的標簽
# li_list = tree.xpath('//ul/li[contains(@id,"l")]/text()')
# 查找 <li> 標簽的id中以‘s’開頭的標簽
# li_list = tree.xpath('//ul/li[starts-with(@id,"s")]/text()')# 邏輯運算
# 查詢<li>標簽中id為‘l1’且class的屬性值為‘c1’的標簽
# li_list = tree.xpath('//ul/li[@id="l1" and @class="c1"]/text()')
# 查詢<li>標簽中id為‘s1’或者class為‘c1’的標簽
li_list = tree.xpath('//ul/li[@id="s1"]/text() | //ul/li[@class="c1"]/text()')
print(li_list)
服務器文件解析完整代碼:
from lxml import etree
import urllib.request###############################
####### 解析服務器文件 ##########
################################ 1.獲取網頁的源碼
url = 'https://www.baidu.com/'
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"
}
# 請求對象定制
request = urllib.request.Request(url, headers=headers)
# 模擬客戶端向服務器發送請求
response = urllib.request.urlopen(request)
# 獲取網頁源碼
content = response.read().decode('utf-8')# 2.解析服務器響應文件
# 解析服務器響應的文件
tree = etree.HTML(content)# 打印 Xpath 的返回值是一個列表類型的數據
# result= tree.xpath('//input[@id="su"]/@value')
result = tree.xpath('//*[@id="su"]/@value')
print(result)
四、Xpath-抓取圖片
抓取站長素材網站的圖片
1.設置url
查找每一頁 url 的規律
# 找 url 的規律
# url : https://sc.chinaz.com/tupian/cixiutuan.html page = 1
# url : https://sc.chinaz.com/tupian/cixiutuan_2.html page = 2
# url : https://sc.chinaz.com/tupian/cixiutuan_3.html page = 3
2.請求對象定制
def create_request(page):if page == 1:url = 'https://sc.chinaz.com/tupian/cixiutuan.html'else:url = 'https://sc.chinaz.com/tupian/cixiutuan_'+str(page)+'.html'headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"}request = urllib.request.Request(url, headers=headers)return request
3.獲取網頁源碼
def get_content(request):response = urllib.request.urlopen(request)content = response.read().decode('utf-8')return content
?4.下載圖片
通過Xpath獲取圖片的鏈接和圖片名稱
右鍵檢查 --> 定位到圖片的標簽行 -->?在Xpath擴展的左側框中寫入Xpath?--> 右側與想要的數據吻合?--> 復制這個Xpath
但是!!!有時候在網頁上獲取的Xpath和通過response獲取Xpath是不一樣的,如果沒有返回內容,就把網頁下載下來看一下Xpath。
有時候src并不是真實的路徑,可能會在‘data-original’中,重點是要檢查content中的內容。
有的網站也會存在懶加載,src的屬性就會變成src2,這個問題就需要根據從content和頁面多加辨別。
def download(content):# 下載圖片# urllib.request.urlretrieve('圖片地址', '圖片名稱') # 這兩項我們都沒有,那我們就要先獲取tree = etree.HTML(content)src_list = tree.xpath('//div[@class="tupian-list com-img-txt-list"]/div/img/@data-original')name_list = tree.xpath('//div[@class="tupian-list com-img-txt-list"]/div/img/@alt')for i in range(len(name_list)):name = name_list[i]src = src_list[i]url = 'https:' + srcurllib.request.urlretrieve(url=url, filename='_072_download_img/'+name+'.png')
5.調用
start_page = int(input('請輸入起始頁碼'))
end_page = int(input('請輸入結束頁碼'))
for page in range(start_page, end_page+1):# 請求對象定制response = create_request(page)# 獲取網頁源碼content = get_content(response)# 下載download(content)
完整代碼:
# 站長素材 https://sc.chinaz.com/
# 站長素材 --> 高清圖片 --> 選擇一個 --> 下載前十頁import urllib.request
from lxml import etree# 找 url 的規律
# url : https://sc.chinaz.com/tupian/cixiutuan.html page = 1
# url : https://sc.chinaz.com/tupian/cixiutuan_2.html page = 2
# url : https://sc.chinaz.com/tupian/cixiutuan_3.html page = 3def create_request(page):if page == 1:url = 'https://sc.chinaz.com/tupian/cixiutuan.html'else:url = 'https://sc.chinaz.com/tupian/cixiutuan_'+str(page)+'.html'headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.76"}request = urllib.request.Request(url, headers=headers)return requestdef get_content(request):response = urllib.request.urlopen(request)content = response.read().decode('utf-8')return contentdef download(content):# 下載圖片# urllib.request.urlretrieve('圖片地址', '圖片名稱') # 這兩項我們都沒有,那我們就要先獲取tree = etree.HTML(content)src_list = tree.xpath('//div[@class="tupian-list com-img-txt-list"]/div/img/@data-original')name_list = tree.xpath('//div[@class="tupian-list com-img-txt-list"]/div/img/@alt')for i in range(len(name_list)):name = name_list[i]src = src_list[i]url = 'https:' + srcurllib.request.urlretrieve(url=url, filename='_072_download_img/'+name+'.png')start_page = int(input('請輸入起始頁碼'))
end_page = int(input('請輸入結束頁碼'))
for page in range(start_page, end_page+1):# 請求對象定制response = create_request(page)# 獲取網頁源碼content = get_content(response)# 下載download(content)
參考
尚硅谷Python爬蟲教程小白零基礎速通(含python基礎+爬蟲案例)