python3 beautifulsoup 表格_[Python3爬虫]Beautiful Soup解析库
解析庫(kù)與Beautiful Soup
通過(guò)request庫(kù),我們已經(jīng)能夠抓取網(wǎng)頁(yè)信息了,但要怎么提取包含在Html代碼里面的有效信息呢?談到匹配有效信息你肯定會(huì)想到正則表達(dá)式,這里就不討論了,實(shí)際上關(guān)于正則表達(dá)式已經(jīng)可以寫(xiě)一本書(shū)了,并且由于網(wǎng)頁(yè)特殊的層級(jí)結(jié)構(gòu),也沒(méi)必要使用正則表達(dá)式。python提供了更好的html和xml的解析庫(kù)Beautiful Soup 和XPath等。
什么是Beautiful Soup
Beautiful Soup 是一個(gè)可以從HTML或XML文件中提取數(shù)據(jù)的Python庫(kù).它能夠通過(guò)你喜歡的轉(zhuǎn)換器實(shí)現(xiàn)慣用的文檔導(dǎo)航,查找,修改文檔的方式.Beautiful Soup會(huì)幫你節(jié)省數(shù)小時(shí)甚至數(shù)天的工作時(shí)間
———Beautiful Soup中文文檔
安裝
pip3 install beautifulsoup4
學(xué)習(xí)準(zhǔn)備
為了學(xué)習(xí)和測(cè)試Beautiful Soup,我寫(xiě)了一個(gè)簡(jiǎn)單的程序框架,包含3個(gè)函數(shù)獲取頁(yè)面,解析頁(yè)面,和主函數(shù),測(cè)試的時(shí)候只要修改解析函數(shù)的部分代碼就可以了
import requests
from bs4 import BeautifulSoup
def getHtml(url): #獲取網(wǎng)頁(yè)內(nèi)容
try:
r = requests.get(url,timeout = 30)
r.encoding = r.apparent_encoding; #設(shè)置編碼格式為原網(wǎng)頁(yè)的編碼格式,避免亂碼
return r.text
except:
return ""
def soupHtml(html): #解析網(wǎng)頁(yè)內(nèi)容
print(html)
soup = BeautifulSoup(html,'lxml')
# 解析代碼
if __name__ == '__main__':
url = "http://www.baidu.com"
html = getHtml(url)
soupHtml(html)
可以看到爬取的是百度的首頁(yè),之后的代碼,添加進(jìn)去就能運(yùn)行了
基本用法
BeautifulSoup(content,"html.parser"/"lxml")
兩個(gè)參數(shù)cnetent表示待解析的網(wǎng)頁(yè)內(nèi)容,后面的參數(shù)可以理解為待解析的格式。lxml解析器有解析HTML和XML的功能,而且速度快,容錯(cuò)能力強(qiáng),所以推薦使用它。
選擇元素
根據(jù)標(biāo)簽名來(lái)選擇元素
soup = BeautifulSoup(html,'lxml')
print(soup.title)
print(soup.head)
print(soup.div)
>>>
百度一下,你就知道連帶標(biāo)簽一起輸出,當(dāng)有多個(gè)標(biāo)簽匹配時(shí),只返回第一個(gè)
獲取內(nèi)容
標(biāo)簽的string方法
soup = BeautifulSoup(html,'lxml')
print(soup.title.string)
print(soup.head.string)
print(soup.div.string)
>>> 百度一下,你就知道
獲取標(biāo)簽的屬性
html中的標(biāo)簽有很多屬性,例如,id,name,class,href等等,可以通過(guò)attrs獲取標(biāo)簽的屬性
soup = BeautifulSoup(html,'lxml')
print(soup.link.attrs)
>>> {'rel': ['stylesheet'], 'type': 'text/css', 'href': 'http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css'}
獲取屬性的值
通過(guò)返回的值,可以知道它是字典類(lèi)型的結(jié)構(gòu),這樣就可以通過(guò)鍵獲取他的值
soup = BeautifulSoup(html,'lxml')
print(soup.p)
>>>
把百度設(shè)為主頁(yè)關(guān)于百度About Baidu
print(soup.p.attrs)
>>> {'id': 'lh'}
print(soup.p.attrs['id'])
>>>lh
關(guān)聯(lián)選擇
在做選擇的時(shí)候,有時(shí)候不能做到一步就選到想要的節(jié)點(diǎn)元素,需要先選中某一個(gè)節(jié)點(diǎn)元素,然后以它為基準(zhǔn)再選擇它的子節(jié)點(diǎn)、父節(jié)點(diǎn)、兄弟節(jié)點(diǎn)等
1.子節(jié)點(diǎn)和子孫節(jié)點(diǎn)
獲取子節(jié)點(diǎn) contents,children
for i,content in enumerate(soup.head.contents):
print(i,content)
for i,child in enumerate(soup.head.children):
print(i,child)
>>>0
1
2
3
百度一下,你就知道4
輸出head標(biāo)簽的子節(jié)點(diǎn),contents和children是等效的
子孫節(jié)點(diǎn)
如果要得到所有的子孫節(jié)點(diǎn)的話,可以調(diào)用descendants屬性
for i,child in enumerate(soup.body.descendants):
print(i,child)
2.父節(jié)點(diǎn)和祖先節(jié)點(diǎn)
如果要獲取某個(gè)節(jié)點(diǎn)元素的父節(jié)點(diǎn),可以調(diào)用parent屬性,獲取其祖先節(jié)點(diǎn)調(diào)用其parents屬性。
3.兄弟節(jié)點(diǎn)
next_sibling和previous_sibling分別獲取節(jié)點(diǎn)的下一個(gè)和上一個(gè)兄弟元素,next_siblings和previous_siblings則分別返回所有前面和后面的兄弟節(jié)點(diǎn)的生成器。
查詢方法
1.find_all()
find_all查詢所有符合條件的元素。給它傳入一些屬性或文本,就可以得到符合條件的元素了。
API接口如下:
find_all(name , attrs , recursive , text , **kwargs)
跟據(jù)名稱查找
for i,input in enumerate(soup.fiind_all(name='input')):
print(i,input)
>>> 0
1
2
3
4
5
6
7
找出所有的input標(biāo)簽
根據(jù)屬性查找
for i,tag in enumerate(soup.find_all(attrs={'class':'mnav'})):
print(i,tag)
>>> 0 糯米
1 新聞
2 hao123
3 地圖
4 視頻
5 貼吧
6 登錄
7 設(shè)置
找出所有class屬性為"mnav"的標(biāo)簽
根據(jù)文本查找
import re
# 導(dǎo)入正則匹配庫(kù)
print(soup.find_all(text=re.compile('百')))
['百度一下,你就知道', '把百度設(shè)為主頁(yè)', '關(guān)于百度', '使用百度前必讀']
2.find()
find()方法與find_all(),方法一致,只是find()返回的是單個(gè)元素,也就是第一個(gè)匹配的元素,而前者返回的是所有匹配的元素組成的列表。這里就不討論了
CSS選擇器
就是專門(mén)用于篩選指定樣式的標(biāo)簽,通過(guò)select方法
print(soup.select('.mnav'))
for i,tag in enumrate(soup.select('.mnav')):
print(i,tag)
>>>0 新聞
1 hao123
2 地圖
3 視頻
4 貼吧
通過(guò)結(jié)果我們發(fā)現(xiàn)其實(shí)完全可以通過(guò)class屬性來(lái)查找,應(yīng)為通過(guò)CSS來(lái)查找本質(zhì)就是通過(guò)class屬性來(lái)查找
程序?qū)崿F(xiàn)
爬取最好大學(xué)網(wǎng)2018年排名信息,并格式化輸出
html代碼分析
1
清華大學(xué)
北京
95.3
100.0
97.50%
1182145
44730
1.447
1556
121
1586283
500525
1.所有大學(xué)信息包含在tbody的子標(biāo)簽中,即整個(gè)表格
2.每一所大學(xué)在一個(gè)tr標(biāo)簽中,即表格中的一行
3.各大學(xué)的排名,名稱,綜合評(píng)分,在td標(biāo)簽中,即表格的一列
request + BeautifkuSoup實(shí)現(xiàn)
import requests
from bs4 import BeautifulSoup
import bs4
def getUnivtext(url):
try:
r=requests.get(url,timeout=30);
r.raise_for_status()
r.encoding=r.apparent_encoding;
return r.text
except:
return ""
def fillUnivList(ulist,html):
soup=BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):#bs4庫(kù)里的標(biāo)簽類(lèi)型
tds=tr('td')
ulist.append([tds[0].string,tds[1].string,tds[3].string])
def printUnivList(ulist,num):
print("{:^10}\t{:<10}\t{:<10}\t".format("排名","大學(xué)名稱","評(píng)分"))
for i in range(num):
u=ulist[i]
print("{:^10}\t{:^6}\t{:^10}\t".format(u[0],u[1],u[2]))
if __name__ == '__main__':
Uinfo=[]
url="http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html"
html=getUnivtext(url)
fillUnivList(Uinfo,html)
printUnivList(Uinfo,310)
運(yùn)行效果
pic1.png
投喂我
寫(xiě)文不易,如果本文對(duì)你有幫助,別忘了投喂我哦
關(guān)于作者
總結(jié)
以上是生活随笔為你收集整理的python3 beautifulsoup 表格_[Python3爬虫]Beautiful Soup解析库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 大数据标签获取处理步骤_大数据处理分为哪
- 下一篇: 中文分词_中文分词及其应用