第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
思路:
- 使用BeautifulSoup解析本地网页
- 获取所需的信息标签
- 精简获取的信息
代码:
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 }