结果
[
{'rate': 5, 'count': '65', 'image': 'img/pic_0000_073a9256d9624c92a05dc680fc28865f.jpg', 'price': '$24.99', 'title': 'EarPod'},
{'rate': 4, 'count': '12', 'image': 'img/pic_0005_828148335519990171_c234285520ff.jpg', 'price': '$64.99', 'title': 'New Pocket'},
{'rate': 4, 'count': '31', 'image': 'img/pic_0006_949802399717918904_339a16e02268.jpg', 'price': '$74.99', 'title': 'New sunglasses'},
{'rate': 3, 'count': '6 ', 'image': 'img/pic_0008_975641865984412951_ade7a767cfc8.jpg', 'price': '$84.99', 'title': 'Art Cup'},
{'rate': 4, 'count': '18', 'image': 'img/pic_0001_160243060888837960_1c3bcd26f5fe.jpg', 'price': '$94.99', 'title': 'iphone gamepad'},
{'rate': 4, 'count': '18', 'image': 'img/pic_0002_556261037783915561_bf22b24b9e4e.jpg', 'price': '$214.5', 'title': 'Best Bed'},
{'rate': 4, 'count': '35', 'image': 'img/pic_0011_1032030741401174813_4e43d182fce7.jpg', 'price': '$500', 'title': 'iWatch'},
{'rate': 4, 'count': '8 ', 'image': 'img/pic_0010_1027323963916688311_09cc2d7648d9.jpg', 'price': '$15.5', 'title': 'Park tickets'}
]
代码如下:
__author__ = 'CP6'
'''
1.使用BeautifulSoup解析网页;
2.使用CSS Selector描述要爬取元素的位置;
3.再把需要信息筛选出来,装到字典里面。
'''
info = []
from bs4 import BeautifulSoup
def printStar(n, str=""):
for i in range(0,n):
str+='★'
if(n==5):
return str
for i in range(0, 5-n):
str+='☆'
return str
with open('C:\\Users\Queen\Desktop\MuggleCode\Plan-for-combating-master\week1\\1_2\\1_2answer_of_homework\index.html','r') as web_data:
Soup = BeautifulSoup(web_data.read(),'lxml')
#print(Soup)
images = 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')
rates = Soup.select('body > div > div > div.col-md-9 > div > div > div > div.ratings > p:nth-of-type(2)')
counts = Soup.select('body > div > div > div.col-md-9 > div > div > div > div.ratings > p.pull-right')
rates2 = Soup.select('body > div > div > div.col-md-9 > div > div > div > div.ratings > p > span')
# print(rates2)
# tests = Soup.findAll(attrs={"class": "glyphicon-star"})
# print(images,titles,prices,rates,counts,sep='\n=====\n')
for image,price,title,rate,count,rate2 in zip(images,prices,titles,rates,counts,rates2):
# print(rate2)
data = {
'image':image.get('src'),
'price':price.get_text(),
'title':title.get_text(),
'count':count.get_text()[0:2],
# 'rate':len(list(rate.findAll(attrs={"class": "glyphicon-star"})))
'rate': printStar(len(list(rate.findAll(attrs={"class": "glyphicon-star"}))))
# 'rate2':len(rate2)
}
# str = printStar(5)
# print(str)
info.append(data)
print(info)
- BeautifulSoup中文文档链接:bs4 bs4_1
- 获取rating
这里的难点不是简单的爬取便签下的文本,而是需要获取到p标签下的类名为glyphicon-star的span的数量,如图二,也就是该p标签下有4个名为star的span标签,也就是四课星。通过了解BeautifulSoup的文档知道,有一个findall()方法正好适用。
data_soup.find_all(attrs={"data-foo": "value"})
本例中:调用了len(arr)获取了,span数组的长度,也就是星数。
len(list(rate.findAll(attrs={"class": "glyphicon-star"})))
另一种思路:
stars_count = len(star.find_all("span","glyphicon glyphicon-star"))
- print(rates, titles, cates, sep="\n-----\n");
sep, seperate的意思,也就是每个打印的变量用sep来分隔开。
- 打印星星
def printStar(n, str=""):
for i in range(0,n):
str+='★'
if(n==5):
return str
for i in range(0, 5-n):
str+='☆'
return str
python中打印字符串的方法还是比较easy,直接+=就可以了。
range函数需要注意的就是它的闭合区间,range(0,n) => [0,n)
- 另外说下,字符串的join方法:**
delimiter = ','
mylist = ['Brazil', 'Russia', 'India', 'China']
print delimiter.join(mylist)
join的功能就是把list中的元素连接在一起,拼合成一个字符串
- replace方法:
'grade': ''.join(star).replace('[', '').replace(']', '').replace(',', '').replace(' ', '')
直接替换了,直接在字符串后面使用.replace( )方法即可
- 另外,说下for循环,在python中貌似不能使用最基本的for循环,必须使用for..in才行,有点诡异,也许是我太弱了。。