<h2>1.導入BeautifulSoup庫</h2>
from bs4 import BeautifulSoup
<h2>2.使用open()函數打開本地頁面</h2>
with open('./web/new_index.html','r') as wb_data:
<h2>3.使用BS構造解析文件并輸出解析結果</h2>
with open('./web/new_index.html','r') as wb_data:
Soup = BeautifulSoup(wb_data,'lxml')
print(Soup)
運行后讀出的是所有的網頁信息,接下來去找我們需要的信息并描述爬取的元素位置
E674E70A-610E-40A1-AECB-3CE6BD5B0251.png
可以看到這個網頁上每一個條目上面有五個元素,分別是圖片、標題、分類標簽、描述、評分。現在把它們一一對應的爬取下來。
<h2>4.使用chrome瀏覽器copy selector獲取每個元素的CSS Selector</h2>
(首先找到頁面對應元素的位置右擊選擇檢查)
91C209FA-FBEE-4BAB-85B1-0CEE1908E5C7.png
以下是五個元素的CSS Selector
body > div.main-content > ul > li:nth-child(1) > div.rate > span
body > div.main-content > ul > li:nth-child(1) > div.article-info > p.description
body > div.main-content > ul > li:nth-child(1) > div.article-info > p.meta-info > span:nth-child(2)
body > div.main-content > ul > li:nth-child(1) > div.article-info > h3 > a
body > div.main-content > ul > li:nth-child(1) > img
因為一個網頁中元素是多個的,上述的CSS Selector是單一元素的,所以我們要去掉描述具體位置的信息(比如nth-child(1)
),還有,cates(分類標簽)如果直接定位到span會打亂它與文章的多對一的關系,導致輸出后只會顯示一個分類標簽,而實際上應該有兩個或者更多的標簽,所以我們需要在它的父級元素p.meta-info就應該停下來,OK,寫入程序后如下
with open('./web/new_index.html','r') as wb_data:
Soup = BeautifulSoup(wb_data,'lxml')
images = Soup.select('body > div.main-content > ul > li > img')
titles = Soup.select('body > div.main-content > ul > li > div.article-info > h3 > a')
descs = Soup.select('body > div.main-content > ul > li > div.article-info > p.description')
rates = Soup.select('body > div.main-content > ul > li > div.rate > span')
cates = Soup.select('body > div.main-content > ul > li > div.article-info > p.meta-info')
print(images,titles,descs,rates,cates,sep='\n----------------\n')
<h2>5.篩選并釋放每一個標簽的所需信息</h2>
for title,image,desc,rate,cate in zip(titles,images,descs,rates,cates):
data = {
'title':title.get_text(),
'rate':rate.get_text(),
'desc':desc.get_text(),
'cate':list(cate.stripped_strings),
'image':image.get('src')
}
print(data)
上面有兩點要注意,第一點:image的信息并不是文本,所以不能用get_text()
,而是直接用get('src')
獲取圖片的路徑信息。第二點:由于cate(分類標簽)篩選的時候是在它的父級元素停下來的,所以應當使用stripped_strings
方法,這個方法可以獲取到父級元素下的所有子元素,這樣我們就可以得到所有的cate,再將它放入到一個list()中。
<h2>6.小拓展,將數據統一放入一個列表中,并循環篩選出評分大于3分的文章</h2>
from bs4 import BeautifulSoup
info = []
with open('./web/new_index.html','r') as wb_data:
Soup = BeautifulSoup(wb_data,'lxml')
images = Soup.select('body > div.main-content > ul > li > img')
titles = Soup.select('body > div.main-content > ul > li > div.article-info > h3 > a')
descs = Soup.select('body > div.main-content > ul > li > div.article-info > p.description')
rates = Soup.select('body > div.main-content > ul > li > div.rate > span')
cates = Soup.select('body > div.main-content > ul > li > div.article-info > p.meta-info')
# print(images,titles,descs,rates,cates,sep='\n----------------\n')
for title,image,desc,rate,cate in zip(titles,images,descs,rates,cates):
data = {
'title':title.get_text(),
'rate':rate.get_text(),
'desc':desc.get_text(),
'cate':list(cate.stripped_strings),
'image':image.get('src')
}
print(data)
info.append(data)
for i in info:
if float(i['rate'])>3:
print(i['title'],i['cate'])