soup = BeautifulSoup(html, 'lxml') # 初始化BeautifulSoup
初始化BeautifuSoup的參數(shù)享幽。
第一個(gè)參數(shù) html是網(wǎng)頁(yè)的源代碼,可以是個(gè)Unicode字符串拾弃,也可以是一個(gè)二進(jìn)制字符串
(如果第一個(gè)參數(shù)是字符串并且網(wǎng)頁(yè)自帶了charset信息值桩,BS會(huì)默認(rèn)采用網(wǎng)頁(yè)的默認(rèn)編碼解碼,
否則默認(rèn)以你當(dāng)前文件執(zhí)行的編碼(通常是utf-8)進(jìn)行解析豪椿。如果是二進(jìn)制字符串奔坟,
如果自己手動(dòng)指定了編碼,就以指定編碼解析搭盾,否則默認(rèn)utf-8解析)咳秉。
第二個(gè)參數(shù) lxml是BeautifulSoup采用的網(wǎng)頁(yè)解析器,我們安裝lxml用處就在這體現(xiàn)出來(lái)了鸯隅。
如果不指定滴某,那么默認(rèn)會(huì)采用Python內(nèi)置的html.parser進(jìn)行解析。
BeautifulSoup的基本使用語(yǔ)法規(guī)則
.find() 使用示例
soup.find('a')滋迈。那么會(huì)返回在soup包含的源代碼中的第一個(gè)<a>...</a>標(biāo)簽內(nèi)容對(duì)象霎奢。
soup.find('a', id='next')。那么會(huì)返回在soup包含的源代碼中饼灿,遇到的第一個(gè)有屬性為id幕侠,值為next的<a>對(duì)象,比如<a id="next">...</a>碍彭。(不只可以用id晤硕,大部分其他的屬性都可以直接使用,比如src庇忌、name舞箍。 **值得注意的是,class這個(gè)屬性因?yàn)槭荘ython關(guān)鍵字皆疹,不能直接使用疏橄,所以在BS里面,使用class_='...'進(jìn)行代替 **)
find返回的結(jié)果略就,依然可以繼續(xù)使用find()或者find_all()方法捎迫。如果找不到指定的內(nèi)容,find會(huì)返回None表牢。.find_all()使用示例
soup.find_all('a')窄绒。那么會(huì)返回在soup包含的源代碼中,遇到的所有<a>...</a>標(biāo)簽內(nèi)容的可迭代對(duì)象(我們可以把它看成一個(gè) list 或者數(shù)組)崔兴。
soup.find_all('a', class_='next')彰导。那么會(huì)返回在soup包含的源代碼中蛔翅,遇到的所有屬性為class,值為next的<a>的 可迭代對(duì)象位谋,比如<a class="next">...</a>山析。(語(yǔ)法和find也一樣,class也不能直接寫)
find_all返回的“l(fā)ist”中的單個(gè)對(duì)象 依然可以繼續(xù)使用find()或者find_all()方法倔幼。如果找不到指定的內(nèi)容,find_all會(huì)返回一個(gè)空的“l(fā)ist”爽待。獲取元素的某個(gè)屬性
soup['src]损同,這樣我們就能取出soup對(duì)象的src屬性了。如果該屬性不存在鸟款,那么程序會(huì)報(bào)錯(cuò)膏燃。獲取元素中的所有文本
** soup.text**,假設(shè)soup對(duì)象為<div>你好<a>復(fù)聯(lián)</a></div>何什,那么這個(gè)操作返回字符串是你好復(fù)聯(lián)组哩。
爬取https://movie.douban.com/cinema/later/chengdu/電影信息代碼
import requests
from bs4 import BeautifulSoup # 從bs4引入BeautifulSoup
#請(qǐng)求網(wǎng)頁(yè)
url = "https://movie.douban.com/cinema/later/chengdu/"
response = requests.get(url)
# 解析網(wǎng)頁(yè)
# 初始化BeautifulSoup方法一:利用網(wǎng)頁(yè)字符串自帶的編碼信息解析網(wǎng)頁(yè)
soup = BeautifulSoup(response.content.decode('utf-8'), 'lxml')
# 初始化BeautifulSoup方法二:手動(dòng)指定解析編碼解析網(wǎng)頁(yè)
# soup = BeautifulSoup(response.content, 'lxml', from_encoding='utf-8')
# print(soup) # 輸出BeautifulSoup轉(zhuǎn)換后的內(nèi)容
all_movies = soup.find('div', id="showing-soon") # 先找到最大的div
# print(all_movies) # 輸出最大的div的內(nèi)容
for each_movie in all_movies.find_all('div', class_="item"): # 從最大的div里面找到影片的div
# print(each_movie) # 輸出每個(gè)影片div的內(nèi)容
all_a_tag = each_movie.find_all('a')
all_li_tag = each_movie.find_all('li')
movie_name = all_a_tag[1].text
moive_href = all_a_tag[1]['href']
movie_date = all_li_tag[0].text
movie_type = all_li_tag[1].text
movie_area = all_li_tag[2].text
movie_lovers = all_li_tag[3].text
print('名字:{},鏈接:{}处渣,日期:{}伶贰,類型:{},地區(qū):{}罐栈, 關(guān)注者:{}'.format(
movie_name, moive_href, movie_date, movie_type, movie_area, movie_lovers))