数据解析学习笔记(正则解析、bs4解析、xpath解析)
生活随笔
收集整理的這篇文章主要介紹了
数据解析学习笔记(正则解析、bs4解析、xpath解析)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
聚焦爬蟲:爬取頁面中指定的頁面內(nèi)容。
- 編碼流程:
- 指定url
- 發(fā)起請求
- 獲取響應數(shù)據(jù)
- 數(shù)據(jù)解析
- 持久化存儲
數(shù)據(jù)解析分類:
數(shù)據(jù)解析原理概述:
- 解析的局部的文本內(nèi)容都會在標簽之間或者標簽對應的屬性中進行存儲
- 1.進行指定標簽的定位
- 2.標簽或者標簽對應的屬性中存儲的數(shù)據(jù)值進行提取(解析)
一、正則解析
常用正則表達式回顧:
項目需求:爬取糗事百科指定頁面的熱圖,并將其保存到指定文件夾中
二、bs4解析
bs4進行數(shù)據(jù)解析- 數(shù)據(jù)解析的原理:- 1.標簽定位- 2.提取標簽、標簽屬性中存儲的數(shù)據(jù)值- bs4數(shù)據(jù)解析的原理:- 1.實例化一個BeautifulSoup對象,并且將頁面源碼數(shù)據(jù)加載到該對象中- 2.通過調(diào)用BeautifulSoup對象中相關(guān)的屬性或者方法進行標簽定位和數(shù)據(jù)提取- 環(huán)境安裝:- pip install bs4- pip install lxml - 如何實例化BeautifulSoup對象:- from bs4 import BeautifulSoup- 對象的實例化:- 1.將本地的html文檔中的數(shù)據(jù)加載到該對象中fp = open('./test.html','r',encoding='utf-8')soup = BeautifulSoup(fp,'lxml')- 2.將互聯(lián)網(wǎng)上獲取的頁面源碼加載到該對象中page_text = response.textsoup = BeatifulSoup(page_text,'lxml')- 提供的用于數(shù)據(jù)解析的方法和屬性:- soup.tagName:返回的是文檔中第一次出現(xiàn)的tagName對應的標簽- soup.find():- find('tagName'):等同于soup.div- 屬性定位:-soup.find('div',class_/id/attr='song')- soup.find_all('tagName'):返回符合要求的所有標簽(列表)- select:- select('某種選擇器(id,class,標簽...選擇器)'),返回的是一個列表。- 層級選擇器:- soup.select('.tang > ul > li > a'):>表示的是一個層級- oup.select('.tang > ul a'):空格表示的多個層級- 獲取標簽之間的文本數(shù)據(jù):- soup.a.text/string/get_text()- text/get_text():可以獲取某一個標簽中所有的文本內(nèi)容- string:只可以獲取該標簽下面直系的文本內(nèi)容- 獲取標簽中屬性值:- soup.a['href'] from bs4 import BeautifulSoupif __name__ == '__main__':# 想要將本地的html文檔的數(shù)據(jù)加載到對象中fp = open('./test.html','r',encoding='utf-8')soup = BeautifulSoup(fp,'lxml')# print(soup)# print(soup.a) # soup.tagName返回的是html中第一次出現(xiàn)的tagName標簽# find('tagName') : 等同于soup.tagName# print(soup.find('div'))# 屬性定位# print(soup.find('div',class_='song'))# print(soup.find_all('a')) # 返回符合要求的所有標簽(返回一個列表)# print(soup.select('.tang')) # 返回一個列表# print(soup.select('.tang > ul > li > a')[0]) # 返回一個列表# print(soup.select('.tang > ul a')[0]) # 返回一個列表# 獲取標簽之間的文本數(shù)據(jù)# text/get_text():可以獲取某一個標簽中所有的文本內(nèi)容print(soup.a.text)print(soup.a.get_text())# string:只可以獲取該標簽下面直系的文本內(nèi)容print(soup.a.string)# 獲取標簽中屬性值print(soup.a['href'])項目需求:使用bs4實現(xiàn)將詩詞名句網(wǎng)站中三國演義小說的每一章的內(nèi)容爬去到本地磁盤進行存儲
三、xpath解析
xpath解析:最常用且最便捷高效的一種解析方式。通用性最強。- xpath解析原理:- 1.實例化一個etree的對象,且需要將被解析的頁面源碼數(shù)據(jù)加載到該對象中。- 2.調(diào)用etree對象中的xpath方法結(jié)合著xpath表達式實現(xiàn)標簽的定位和內(nèi)容的捕獲。- 環(huán)境的安裝:- pip install lxml- 如何實例化一個etree對象:from lxml import etree- 1.將本地的html文檔中的源碼數(shù)據(jù)加載到etree對象中:etree.parse(filePath)- 2.可以將從互聯(lián)網(wǎng)上獲取的源碼數(shù)據(jù)加載到該對象中etree.HTML('page_text')- xpath('xpath表達式')- xpath表達式:- /:表示的是從根節(jié)點開始定位。表示的是一個層級。- //:表示的是多個層級。可以表示從任意位置開始定位。- 屬性定位://div[@class='song'] tag[@attrName="attrValue"]- 索引定位://div[@class="song"]/p[3] 索引是從1開始的。- 取文本:- /text() 獲取的是標簽中直系的文本內(nèi)容- //text() 標簽中非直系的文本內(nèi)容(所有的文本內(nèi)容)- 取屬性:/@attrName ==>img/src1.項目需求:xpath解析案例-4k圖片解析爬取
import requests from lxml import etree import osif __name__ == '__main__':url = 'http://pic.netbian.com/4kmeishi/'# UA偽裝:將對應的User-Agent封裝到一個字典中headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'}response = requests.get(url=url,headers=headers)# 手動設(shè)定響應數(shù)據(jù)的編碼格式# response.encoding = 'utf-8'page_text = response.text# 數(shù)據(jù)解析: src的屬性值 alt的屬性值tree = etree.HTML(page_text)li_list = tree.xpath('//div[@class="slist"]/ul/li')print(li_list)#創(chuàng)建一個文件夾if not os.path.exists('./picLibs'):os.mkdir('./picLibs')for li in li_list:img_src = 'http://pic.netbian.com/' + li.xpath('./a/img/@src')[0]img_name = li.xpath('./a/img/@alt')[0] + '.jpg'# 通用的處理中文亂碼的解決方案img_name = img_name.encode('iso-8859-1').decode('gbk')# print(img_src + img_name)# 請求圖片進行持久化存儲img_data = requests.get(url=img_src,headers=headers).contentimg_path = 'picLibs/' + img_namewith open(img_path,'wb') as fp:fp.write(img_data)print(img_name,'下載成功!!!')2.項目需求:xpath解析案例-全國城市名稱爬取
import requests from lxml import etreeif __name__ == '__main__':url = 'https://www.aqistudy.cn/historydata/'# UA偽裝:將對應的User-Agent封裝到一個字典中headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'}page_text = requests.get(url=url,headers=headers).texttree = etree.HTML(page_text)# 解析到熱門城市和所有城市對應的a標簽a_list = tree.xpath('//div[@class="bottom"]/ul/div[2]/li/a | //div[@class="bottom"]/ul/li/a')all_city_names = []for a in a_list:city_name = a.xpath('./text()')[0]all_city_names.append(city_name)print(all_city_names,len(all_city_names))3.項目需求:批量爬取站長素材免費ppt并保存到本地
總結(jié)
以上是生活随笔為你收集整理的数据解析学习笔记(正则解析、bs4解析、xpath解析)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDb 大数据查询优化、 Mon
- 下一篇: Node中的fs模块