实战计划0430-石头的练习作业
作业的要求如下
html的重要结构如下
<div class="col-sm-4 col-lg-4 col-md-4">
<div class="thumbnail">
<img src="img/pic_0005_828148335519990171_c234285520ff.jpg" alt="">
<div class="caption">
<h4 class="pull-right">$64.99</h4>
<h4><a href="#">New Pocket</a>
</h4>
<p>This is a short description. Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>
<div class="ratings">
<p class="pull-right">12 reviews</p>
<p>
<span class="glyphicon glyphicon-star"></span>
<span class="glyphicon glyphicon-star"></span>
<span class="glyphicon glyphicon-star"></span>
<span class="glyphicon glyphicon-star"></span>
<span class="glyphicon glyphicon-star-empty"></span>
</p>
</div>
</div>
</div>
实现的代码如下
__author__ = 'daijielei'
from bs4 import BeautifulSoup
file = open('1_2_homework_required/index.html','r')#将本地的html加载进来
soup = BeautifulSoup(file.read(),'lxml')#用BeautifuSoup将html的文本格式化以方便寻找所需要的内容
for item in soup.select('.thumbnail'):
data={}
data['title'] = item.select('a')[0].getText() if item.select('a') else '' #if else 做校验,以防止抓取到的数据为无效数据
data['imgurl'] = item.select('img')[0].get('src') if item.select('img') else ''
data['price'] = item.select('h4.pull-right')[0].getText() if item.select('h4.pull-right') else ''
data['review'] = item.select('p.pull-right')[0].getText() if item.select('p.pull-right') else ''
data['rate'] = 1*len(item.select('.glyphicon.glyphicon-star')) + 0.5*len(item.select('.glyphicon.glyphicon-star-empty'))#根据星的个数计算分数
print(data)
笔记、思考与总结
1、html里都是一块块的,结构非常清晰,所以先用筛选出一整块的资料,这样要处理的都是块内的内容,比较清晰
for item in soup.select('.thumbnail'):
2、对每块的内容进行处理时,加了判断语句来保证抓取的内容不对的时候不会出错,因为是先学完了课程后面才来补作业的,所以比最开始学的时候简洁多了
data['title'] = item.select('a')[0].getText() if item.select('a') else '' #if else 做校验,以防止抓取到的数据为无效数据
3、提取的内容中,比较难提取的是评分,因为不能直接提取出一个标签,html语句是这样的
<div class="ratings">
<p class="pull-right">12 reviews</p>
<p>
<span class="glyphicon glyphicon-star"></span>
<span class="glyphicon glyphicon-star"></span>
<span class="glyphicon glyphicon-star"></span>
<span class="glyphicon glyphicon-star"></span>
<span class="glyphicon glyphicon-star-empty"></span>
</p>
</div>
实际上就是要算出一共有多少个满星标签和多少个半星标签,做一下换算。
data['rate'] = 1*len(item.select('.glyphicon.glyphicon-star')) + 0.5*len(item.select('.glyphicon.glyphicon-star-empty'))#根据星的个数计算分数