爬蟲解析——Xpath的安裝及使用(五)

目錄

一、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基礎+爬蟲案例)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213260.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213260.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213260.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣373. 查找和最小的 K 對數字

優先隊列 思路&#xff1a; 使用下標 (x, y) 標識數值對&#xff0c;x 為第一個數組的下標&#xff0c;y 為第二個數組的下標&#xff1b;所以 k 個數值對 x 的范圍屬于 [0, min(k, m)]&#xff0c;m 為第一個數組的 size&#xff1b;數值對 (x, y) &#xff0c;那么下一個比其…

TailwindCSS 如何處理RTL布局模式

背景 TikTok作為目前全世界最受歡迎的APP&#xff0c;需要考慮兼容全世界各個地區的本地化語言和閱讀習慣。其中對于阿拉伯語、波斯語等語言的閱讀書寫習慣是從右向左的&#xff0c;在前端有一個專有名字RTL模式&#xff0c;即Right-to-Left。 其中以阿拉伯語作為第一語言的人…

C# 獲取windows 系統開關機時間

關機時間&#xff0c;引用&#xff1a;https://www.coder.work/article/1589448 public static DateTime GetLastSystemShutdown() { string sKey "System\CurrentControlSet\Control\Windows"; Microsoft.Win32.RegistryKey key …

建立個人學習觀|地鐵上的自習室

作者&#xff1a;向知 如果大家有機會來北京&#xff0c;可以來看看工作日早上八九點鐘&#xff0c;15 號線從那座叫“順義”的城市通向“望京”的地鐵&#xff0c;你在那上面&#xff0c;能看到明明白白的&#xff0c;人們奔向夢想的模樣。 一、地鐵上的自習室 我在來北京之前…

華為數據之道學習筆記】3-5 規則數據治理

在業務規則管理方面&#xff0c;華為經常面對“各種業務場景業務規則不同&#xff0c;記不住&#xff0c;找不到”“大量規則在政策、流程等文件中承載&#xff0c;難以遵守”“各國規則均不同&#xff0c;IT能否一國一策、快速上線”等問題。 規則數據是結構化描述業務規則變量…

【算法集訓】基礎數據結構:三、鏈表

鏈表就是將所有數據都用一個鏈子串起來&#xff0c;其中鏈表也有多種形式&#xff0c;包含單向鏈表、雙向鏈表等&#xff1b; 現在畢竟還是基礎階段&#xff0c;就先學習單鏈表吧&#xff1b; 鏈表用頭結點head表示一整個鏈表&#xff0c;每個鏈表的節點包含當前節點的值val和下…

2024 年頂級的 Android 系統修復軟件與方法

您是否正在尋找可以修復 PC 上 Android 操作系統的工具&#xff1f;這是我們精選的最好的 Android 系統修復軟件&#xff01; Android 是世界著名的智能手機操作系統。全世界有數百萬人使用這個操作系統&#xff0c;這使得它安全可靠。然而&#xff0c;這仍然不能使它完美無缺…

048:利用vue-video-player播放m3u8

第048個 查看專欄目錄: VUE ------ element UI 專欄目標 在vue和element UI聯合技術棧的操控下&#xff0c;本專欄提供行之有效的源代碼示例和信息點介紹&#xff0c;做到靈活運用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安裝、引用&#xff0c;模板使…

普冉(PUYA)單片機開發筆記(6): 呼吸燈

概述 上一篇的實驗中&#xff0c;分別正確地配置了 TIM16 和 TIM1&#xff0c;TIM16 的中斷服務程序中每隔 500ms 翻轉板載 LED 一次&#xff1b;TIM1 的 CHANNEL_1 用于輸出一個固定占空比的 PWM 信號。這一次我們進一小步&#xff1a;使用 TIM16 的中斷設置 TIM1 CHANNEL_1 …

MyBatis進階之分頁和延遲加載

文章目錄 分頁1. RowBounds 分頁2. PageHelper 分頁3. PageInfo 對象屬性描述 延遲加載立即加載激進式延遲加載真-延遲加載 分頁 Mybatis 中實現分頁功能有 3 種途徑&#xff1a; RowBounds 分頁&#xff08;不建議使用&#xff09;Example 分頁&#xff08;簡單情況可用)Pag…

關于對向量檢索研究的一些學習資料整理

官方學習資料 主要是的學習資料是&#xff0c; 官方文檔 和官方博客。相關文章還是挺多 挺不錯的 他們更新也比較及時。有最新的東西 都會更新出來。es scdn官方博客 這里簡單列一些&#xff0c;還有一些其他的&#xff0c;大家自己感興趣去看。 什么是向量數據庫 Elasticse…

文件加密軟件哪個最好用 好用的文件加密軟件推薦

一說到文件加密軟件&#xff0c;可能大家都會去搜一些不知名的軟件來&#xff0c;但是選擇這種加密軟件&#xff0c;最好還是要看一些資質的。 資質不好的&#xff0c;可能加密過后你自己也打不開文件&#xff0c;&#xff08;ps&#xff1a;我自己就遇到過這種情況&#xff09…

【華為OD機試python】分蘋果【2023 B卷|100分】

【華為OD機試】-真題 !!點這里!! 【華為OD機試】真題考點分類 !!點這里 !! 題目描述 A、B兩個人把蘋果分為兩堆,A希望按照他的計算規則等分蘋果, 他的計算規則是按照二進制加法計算,并且不計算進位 12+5=9(1100 + 0101 = 9), B的計算規則是十進制加法,包括正常進位,…

基于Java SSM框架高校校園點餐訂餐系統項目【項目源碼+論文說明】計算機畢業設計

基于java的SSM框架高校校園點餐訂餐系統演示 摘要 21世紀的今天&#xff0c;隨著社會的不斷發展與進步&#xff0c;人們對于信息科學化的認識&#xff0c;已由低層次向高層次發展&#xff0c;由原來的感性認識向理性認識提高&#xff0c;管理工作的重要性已逐漸被人們所認識&a…

(一)Java 基礎語法

目錄 一. 前言 二. Hello World 三. Java 語法 3.1. 基本語法 3.2. Java 標識符 3.3. Java 修飾符 3.4. Java 變量 3.5. Java 數組 3.6. Java 枚舉 3.7. Java 關鍵字 3.8. Java 注釋 3.9. Java 空行 3.10. Java 繼承 3.11. Java 接口&#xff08;interface&#…

Oracle(2-14)User-Managed Incomplete Recovery

文章目錄 一、基礎知識1、Incomplete Recovery Overview 不完全恢復概述2、Situations Requiring IR 需要不完全恢復的情況3、Types of IR 不完全恢復的類型4、IR Guidelines 不完全恢復指南5、User-Managed Procedures 用戶管理程序6、RECOVER Command Overview 恢復命令概述7…

算法訓練營Day8(字符串)

344.反轉字符串 344. 反轉字符串 - 力扣&#xff08;LeetCode&#xff09; class Solution {public void reverseString(char[] s) {for(int i 0,j s.length-1;i< s.length/2 ; i,j--){swap(s,i,j);}}public void swap(char[] s,int i,int j ){char temp s[i];s[i] s[j]…

Python數據科學視頻講解:Python注釋

2.3 Python注釋 視頻為《Python數據科學應用從入門到精通》張甜 楊維忠 清華大學出版社一書的隨書贈送視頻講解2.3節內容。本書已正式出版上市&#xff0c;當當、京東、淘寶等平臺熱銷中&#xff0c;搜索書名即可。內容涵蓋數據科學應用的全流程&#xff0c;包括數據科學應用和…

20231210原始編譯NanoPC-T4(RK3399)開發板的Android10的SDK

20231210原始編譯NanoPC-T4(RK3399)開發板的Android10的SDK 2023/12/10 17:27 rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ mkdir nanopc-t4 rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ cd nanopc-t4/ …

python4E 之 Dict 找到兩個不同索引但都需要對應的值。

找到兩個不同索引但都需要&#xff0c;對應的值。 df pd.DataFrame(np.random.randint(1, 10, [3,3]), columns list(ABC)) 通過 dict 制造key index_htable{} for _,row in idc.iterrows(): #按行循環 key str(row[u股票代碼]) | str(row[u日期]) #根據不同 的索引…