1-2homework

结果

[
{'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
1-2homework_第1张图片
First_Image.png
1-2homework_第2张图片
Second_Image.png

这里的难点不是简单的爬取便签下的文本,而是需要获取到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才行,有点诡异,也许是我太弱了。。

你可能感兴趣的:(1-2homework)