第10课、练习项目:爬取商品信息

目标:爬取本地网页中的商品信息,并打印星级评分大于3的文章

准备:

1. find_all()方法

 find_all()方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件。

2. len()方法

len() 方法返回对象(字符、列表、元组等)长度或项目个数。 例如:

1 >>>str = "runoob"
2 >>> len(str)             # 字符串长度
3 6
4 >>> l = [1,2,3,4,5]
5 >>> len(l)               # 列表元素个数
6 5

 

思路:

  1.  使用BeautifulSoup解析本地网页
  2.  获取所需的信息标签
  3.  精简获取的信息


代码:

 1 from bs4 import BeautifulSoup
 2 
 3 info = []
 4 with open('/Users/my/Desktop/lesson10/index.html','r') as wb_data:
 5     Soup = BeautifulSoup(wb_data,'lxml')
 6 
 7     # 以下依次是图像、标题、价格、描述、星级评分、
 8     images = Soup.select('body > div > div > div.col-md-9 > div > div > div > img')
 9     titles = Soup.select('body > div > div > div.col-md-9 > div > div > div > div.caption > h4 > a')
10     prices = Soup.select('body > div > div > div.col-md-9 > div > div > div > div.caption > h4.pull-right')
11     descs = Soup.select('body > div > div > div.col-md-9 > div > div > div > div.caption > p')
12     stars = Soup.select('body > div > div > div.col-md-9 > div > div > div > div.ratings > p:nth-of-type(2)')
13 #   为了从父节点开始取,此处保留:nth-of-type(2),通过观察网页,多取几个星星的selector,就发现规律了
14 #     print(images,titles,prices,descs,stars,sep='\n---------------------------------\n')
15 
16 for image,title,price,desc,star in zip(images,titles,prices,descs,stars):
17     data = {
18         'image': image.get('src'),      # get()获得某个标签的属性
19         'title': title.get_text(),      # get_text()去除html标签,获得文本信息。
20         'price': price.get_text(),
21         'desc': desc.get_text(),
22         'star': len(star.find_all("span", class_='glyphicon glyphicon-star'))
23         # 观察发现,每一个星星会有一次<span class="glyphicon glyphicon-star"></span>,所以我们统计有多少次,就知道有多少个星星了;
24         # 使用find_all 统计有几处是★的样式,第一个参数定位标签名,第二个参数定位css 样式,
25         # 具体可以参考BeautifulSoup 文档示例http://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/#find-all;
26         # 由于find_all()返回的结果是列表,我们再使用len()方法去计算列表中的元素个数,也就是星星的数量
27     }
28     info.append(data)
29 
30 # 打印星级评分大于3的文章
31 for i in info:
32     if float(i['star'])>3:
33         print(i['title'],i['star'])

问题:
1. 在获取星星评分的标签中,定位标签中末尾用到nth-of-type的说明
规定属于其父元素的第二个 p 元素的每个 p,例如一个父级元素有两个p元素,则定位第二个p元素:

1 p:nth-of-type(2)
2 {
3 background:#ff0000;
4 }

 



转载于:https://www.cnblogs.com/wall9527/p/9866872.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值