Python学习 Day43 数据解析-BeautifulSoup 07
生活随笔
收集整理的這篇文章主要介紹了
Python学习 Day43 数据解析-BeautifulSoup 07
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
BeautifulSoup 解析數據
一、BeautifulSoup概述
1.BeautifulSoup
- 是一個可以從HTML或XML文檔中提取數據的Python庫
- 功能簡單強大、容錯能力高、文檔相對完善,清晰易懂
- 非Python標準模塊,需要安裝才能使用
2.安裝方式
- pip install bs4 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
3.測試方式
- import bs4
4.解析器
BeautifulSoup支持Python標準庫中的HTML解析器,還支持一些第三方的解析器,如果不安裝第三方解析器,則Python會使用默認解析器
(1)標準庫
- 使用方法:BeautifulSoup(html,‘html.parser’)
- 優點:內置標準庫,速度適中,文檔容錯能力強
- 缺點:Python3.2版本前的文檔容錯能力差
(2)lxml HTML
- 使用方法:BeautifulSoup(html,‘lxml’)
- 優點:速度快,文檔容錯能力強
- 缺點:安裝C語言庫
(3)lxml XML
- 使用方法:BeautifulSoup(html,‘xml’)
- 優點:速度快,唯一支持XML
- 缺點:安裝C語言庫
(4)html5lib
- 使用方法:BeautifulSoup(html,‘html5lib’)
- 優點:容錯能力最強,可生成HTML5
- 缺點:運行慢,擴展差
二、代碼創建bs4對象
from bs4 import BeautifulSoup#待解析的文檔 html = '''<html><head><title>水面清圓</title></head><body><h1 class = 'cur book' float = 'left'>一一風荷舉</h1><a href = 'http://www.baidu.com'></a><h2><!--這里是注釋--></h2></body></html> '''#選擇一個解析器,創建bs對象 bs = BeautifulSoup(html,'lxml') #獲取標簽 print(bs.title) #獲取h1標簽的所有屬性 列表形式存放多個屬性值 print(bs.h1.attrs) #獲取單個屬性 print(bs.h1.get('class')) #寫法1 print(bs.h1['class']) #寫法2 #獲取屬性值 print(bs.a['href']) #獲取文本 print(bs.title.text) print(bs.title.string)#獲取內容 print('text:',bs.h2.text) #僅獲取文本內容 print('string:',bs.h2.string) #獲取到h2標簽中的所有內容 <title>水面清圓</title> {'class': ['cur', 'book'], 'float': 'left'} ['cur', 'book'] ['cur', 'book'] http://www.baidu.com 水面清圓 水面清圓 text: string: 這里是注釋Process finished with exit code 0三、BS提取數據常用方法
(一)find()方法
- 1.返回值類型:Tag
- 2.功能:提取滿足要求的首個數據
- 3.語法:bs.find(標簽,屬性)
- 4.舉例:bs.find(‘div’,class_=‘books’)
(二)find_all()方法
- 1.返回值類型:Tag
- 2.功能:提取滿足要求的所有數據
- 3.語法:bs.find_all(標簽,屬性)
- 4.舉例:bs.find_all(‘div’,class_=‘books’)
(三)CSS選擇器
- 1.通過ID查找:bs.select(’#abc’)
- 2.通過classa查找:bs.select(’.abc’)
- 3.通過屬性查找:bs.select(a[‘class=“abc”’])
(四)Tag對象
- 1.獲取標簽:bs.title
- 2.獲取所有屬性:bs.title.attrs
- 3.獲取單個屬性的值:
寫法1: bs.div.get(‘class’)
寫法2: bs.div.[‘class’]
寫法3: bs.a(‘href’)
代碼實現
from bs4 import BeautifulSoup #待解析的文檔 html = '''<title>晴空一鶴排云上</title><div class = 'info' float = 'left'>便引詩情到碧霄</div><div class = 'info' float = 'right' id = 'gb'><span>好好學習,天天向上</span><a href = 'http://www.baidu.com'></a></div><span>我是第二個span</span>''' #解析數據 bs = BeautifulSoup(html,'lxml') #獲得Tag對象 print(bs.title,type(bs.title))print('\n--------------bs.find()方法------------------------') #bs.find()方法:獲取滿足條件的第一個標簽,其類型也為Tag print(bs.find('div',class_='info'),type(bs.find('div',class_='info')))print('\n--------------bs.find_all()方法------------------------') #bs.find_all()方法:獲取滿足條件的所有標簽,返回的是一個標簽列表 print(bs.find_all('div',class_='info'),type(bs.find_all('div',class_='info')))print('\n-----------------------遍歷每一個標簽---------------------') for item in bs.find_all('div',class_ = 'info'):print(item,type(item))print('\n--------------獲取屬性--------------------') print(bs.find_all('div',attrs={'float':'right'}))print('\n---------------CSS選擇器---------------------') print(bs.select('#gb')) print('\n------------------------------------------------') print(bs.select('.info'))print('\n--------------獲取div標簽下的span標簽--------------------------') print(bs.select('div>span'))print('\n------------------------------------------------') print(bs.select('div.info>span'))print('\n------------------獲取標簽中的文本內容------------') for item in bs.select('div.info>span'):print(item.text) <title>晴空一鶴排云上</title> <class 'bs4.element.Tag'>--------------bs.find()方法------------------------ <div class="info" float="left">便引詩情到碧霄</div> <class 'bs4.element.Tag'>--------------bs.find_all()方法------------------------ [<div class="info" float="left">便引詩情到碧霄</div>, <div class="info" float="right" id="gb"> <span>好好學習,天天向上</span> <a href="http://www.baidu.com"></a> </div>] <class 'bs4.element.ResultSet'>-----------------------遍歷每一個標簽--------------------- <div class="info" float="left">便引詩情到碧霄</div> <class 'bs4.element.Tag'> <div class="info" float="right" id="gb"> <span>好好學習,天天向上</span> <a href="http://www.baidu.com"></a> </div> <class 'bs4.element.Tag'>--------------獲取屬性-------------------- [<div class="info" float="right" id="gb"> <span>好好學習,天天向上</span> <a href="http://www.baidu.com"></a> </div>]---------------CSS選擇器--------------------- [<div class="info" float="right" id="gb"> <span>好好學習,天天向上</span> <a href="http://www.baidu.com"></a> </div>]------------------------------------------------ [<div class="info" float="left">便引詩情到碧霄</div>, <div class="info" float="right" id="gb"> <span>好好學習,天天向上</span> <a href="http://www.baidu.com"></a> </div>]--------------獲取div標簽下的span標簽-------------------------- [<span>好好學習,天天向上</span>]------------------------------------------------ [<span>好好學習,天天向上</span>]------------------獲取標簽中的文本內容------------ 好好學習,天天向上Process finished with exit code 0四、案例
爬取淘寶網首頁
import requests from bs4 import BeautifulSoup#請求的URL:淘寶網首頁 url = 'https://uland.taobao.com/' #加入請求頭 headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36'} #發送請求 resp = requests.get(url,headers) #返回一個HTML文檔#創建一個bs對象,解析返回的HTML文檔 bs = BeautifulSoup(resp.text,'lxml') #查詢所有的a標簽 a_list = bs.find_all('a') #遍歷每個a標簽,以獲取其href的屬性值 for a in a_list:url = a.get('href')#print(url)if url == None: #去掉href為空值的標簽屬性continueif url.startswith('http') or url.startswith('https'): #獲取以HTTP或HTTPS開頭的完整網址print(url)輸出結果為可以跳轉的鏈接
https://s.click.taobao.com/t?union_lens=lensId%3AOPT%401601203401%400b0f99df_a5b3_174cf28f3bb_ad79%4001%3BeventPageId%3A20150318020000648&e=m%3D2%26s%3Diaj%2F%2FMChDMNw4vFB6t2Z2iperVdZeJviePMclkcdtjxyINtkUhsv0K5mYvcBEhv8U9RX0Iw%2BkeJD415GGSsrJ4YxhNUZ2i3GTlT4SLzYDiBT2M421%2BABgTvflh4%2Fhqj89CGjsatFbg%2FkxFiXT%2FI5kdHG0mETTJw4I%2FQKsMyWv9lyeNAoQluSar7Bu%2FpJjtAXjXL88Z9Mt2nGDmntuH4VtA%3D%3D&pid=mm_0_0_0 https://s.click.taobao.com/t?union_lens=lensId%3AOPT%401602583439%400b5dc12f_df39_175216aa7d3_3ba4%4001%3BeventPageId%3A20150318020000813&e=m%3D2%26s%3DVSDHOXPRC4YcQipKwQzePCperVdZeJviePMclkcdtjxyINtkUhsv0LByEUqSWs8wxHXUNZRa3F5D415GGSsrJ4YxhNUZ2i3GTlT4SLzYDiBT2M421%2BABgTvflh4%2Fhqj89CGjsatFbg%2FkxFiXT%2FI5kdv2ej9RFznDujXyQ8P5hEAW95D0t3aOisosmJjNa%2FrGYpyF7ku%2BxKjfv8uao0UzJSWcMOnOtXCYRnn6ynij93lsDvbh8Qt7h%2F7mglw2LhJ8IdKpkygapz%2FOumdbRSBMWogPh2VpbvcT8PwOkD4ulZfxvNaaibhIncDlE6H93yEw17wnkme1OdGDcT9IgYeWFwpobexl%2Fx%2FZ&pid=mm_0_0_0 https://s.click.taobao.com/t?union_lens=lensId%3AOPT%401600161414%400b59e276_31e8_174910d7ee5_1434%4001%3BeventPageId%3A20150318020000406&e=m%3D2%26s%3D5LNEiCktsG5w4vFB6t2Z2iperVdZeJviePMclkcdtjxyINtkUhsv0KBG0TwCFKWFemLun%2Boqc%2FVD415GGSsrJ4YxhNUZ2i3GTlT4SLzYDiBT2M421%2BABgTvflh4%2Fhqj89CGjsatFbg%2FkxFiXT%2FI5kdv2ej9RFznDujXyQ8P5hEAW95D0t3aOisosmJjNa%2FrGraOxjvWhHnYV5fRYrrSW6WwO9uHxC3uHfE%2BH0gbC0KpkDV443qLdLqxZ2nVWPAAw2n9Az55wlDRExsN3p515W%2FKamps88B8EQWLobdpSETDGDF1NzTQoPw%3D%3D&&pid=mm_0_0_0 https://s.click.taobao.com/t?union_lens=lensId%3AOPT%401602583439%400b1a25d9_3fc2_175216aa7eb_ac58%4001%3BeventPageId%3A20150318020000814&e=m%3D2%26s%3D3q2KSPwGXwYcQipKwQzePCperVdZeJviePMclkcdtjxyINtkUhsv0LByEUqSWs8wxHXUNZRa3F5D415GGSsrJ4YxhNUZ2i3GTlT4SLzYDiBT2M421%2BABgTvflh4%2Fhqj89CGjsatFbg%2FkxFiXT%2FI5kdv2ej9RFznDujXyQ8P5hEAW95D0t3aOisosmJjNa%2FrGYpyF7ku%2BxKjfv8uao0UzJSWcMOnOtXCYRnn6ynij93lsDvbh8Qt7h%2F7mglw2LhJ8IdKpkygapz8i98XAIvg9KYgPh2VpbvcT8PwOkD4ulZfxvNaaibhIncDlE6H93yEw17wnkme1OdGDcT9IgYeWFwpobexl%2Fx%2FZ&pid=mm_0_0_0 https://www.etao.com/cjfl/info.htm?activityId=1495387 https://s.click.taobao.com/t?e=m%3D2%26s%3DaCBbXzf6%2Bp8cQipKwQzePDAVflQIoZepK7Vc7tFgwiFRAdhuF14FMTCw9kUE1PCMaqAeRGk4m9Lb6q32bH9H5L2YnZ7gs%2Faz&pid=mm_0_0_0 https://mo.m.taobao.com/union/live?pid=mm_0_0_0Process finished with exit code 0總結
以上是生活随笔為你收集整理的Python学习 Day43 数据解析-BeautifulSoup 07的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自媒体素材库有哪些?蚁小二带你找素材
- 下一篇: websocket python爬虫_p