前兩小節(jié)學習了網頁的元素還有bs4的使用,本小節(jié)使用bs4庫抓取本地html文件中有價值內容捂寿,并以【圖片來源口四,價格,描述秦陋,評價數蔓彩,評價星級】的列表來描述(是個類購物網站)。真實的網頁抓取還亟需學習驳概。具體實現細節(jié)如下赤嚼,當初自己需要注意的地方一一列下
實現效果
{'price': u'$24.99', 'review': u'65 reviews', 'star': 5, 'image': 'img/pic_0000_073a9256d9624c92a05dc680fc28865f.jpg', 'title': u'EarPod'}
{'price': u'$64.99', 'review': u'12 reviews', 'star': 4, 'image': 'img/pic_0005_828148335519990171_c234285520ff.jpg', 'title': u'New Pocket'}
{'price': u'$74.99', 'review': u'31 reviews', 'star': 4, 'image': 'img/pic_0006_949802399717918904_339a16e02268.jpg', 'title': u'New sunglasses'}
{'price': u'$84.99', 'review': u'6 reviews', 'star': 3, 'image': 'img/pic_0008_975641865984412951_ade7a767cfc8.jpg', 'title': u'Art Cup'}
{'price': u'$94.99', 'review': u'18 reviews', 'star': 4, 'image': 'img/pic_0001_160243060888837960_1c3bcd26f5fe.jpg', 'title': u'iphone gamepad'}
{'price': u'$214.5', 'review': u'18 reviews', 'star': 4, 'image': 'img/pic_0002_556261037783915561_bf22b24b9e4e.jpg', 'title': u'Best Bed'}
{'price': u'$500', 'review': u'35 reviews', 'star': 4, 'image': 'img/pic_0011_1032030741401174813_4e43d182fce7.jpg', 'title': u'iWatch'}
{'price': u'$15.5', 'review': u'8 reviews', 'star': 4, 'image': 'img/pic_0010_1027323963916688311_09cc2d7648d9.jpg', 'title': u'Park tickets'}
我的代碼
除了星級評價,其他特征的篩選以及相應字典的構造都十分簡單顺又,對于星級評價更卒,可以配合find_all函數和len()實現,但是需要理解CSS SELECTOR路徑稚照。星級評價的分兩種元素蹂空,我的方法是直接找出所有的元素構成的list,每五個元素進行判斷一次評級锐锣,最后得到每種商品的評級腌闯。方法實現比較粗暴,有空還需要學習一下CSS Selector雕憔。
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
with open('****html path****', 'r') as web_data: #一定要注意‘/’
Soup=BeautifulSoup(web_data, 'lxml')
imgs=Soup.select('body > div > div > div.col-md-9 > div > div > div > img')
prices=Soup.select('body > div > div > div.col-md-9 > div > div > div > div.caption > h4.pull-right')
titles=Soup.select('body > div > div > div.col-md-9 > div > div > div > div.caption > h4 > a')
Num_rates=Soup.select('body > div > div > div.col-md-9 > div > div > div > div.ratings > p.pull-right')
Star_rates=Soup.select('body > div > div > div.col-md-9 > div > div > div > div.ratings > p > span')
#stars = soup.select("div > div.ratings > p:nth-of-type(2)") 這樣就可以每五個星標或沒有星標作為list中的一個元素
#Count計數\\
Bgn=0
count=0
Dcount=0
Count=[]
Stars=[]
for Star_rate in Star_rates: # 一定要先轉換成字符串的列表元素,bs4得到的湯是一種特殊的列表
Star_rate=str(Star_rate)
Stars.append(Star_rate)
print Stars
for x in range(0, len(imgs)):
if '<span class="glyphicon glyphicon-star-empty"></span>' in (Stars[Bgn:Bgn+5]):
#print str(Star_rates[Bgn:Bgn+5])
count=(Stars[Bgn:Bgn+5]).index('<span class="glyphicon glyphicon-star-empty"></span>') #第一個empty也就是沒有星標的元素出現的位置也就是該商品的評分呀
else:
count=5
Bgn=Bgn+5
Count.append(count)
print count
print Count
#構造dict
Info=[]
for img,price,title,Num_rate,value in zip(imgs,prices,titles,Num_rates,Count):
data={
'img': img.get('src'),
'price':price.get_text(),
'title': title.get_text(),
'Num_rate': Num_rate.get_text(),
'Star': value
}
print data
總結
- lxml庫安裝真的是個大坑糖声,‘html.paeser'得到的soup不夠美味呀斤彼。無奈最近臺式機網絡太爛分瘦,無法pip install,使用pycharm缺少h文件琉苇,最后還是安利一下Enthougth Canopy嘲玫,集成了很多py庫,幫助我解決了這個問題
- 到底那個stars 怎么select得到的并扇?去团??穷蛹?土陪?
- 最后select后的內容是一種特殊的list,每一個元素如果要作為字符串使用必須要遍歷后進行字符串的強制轉換