一. BeautifulSoup的官方解释:
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
1. 在上一篇文章,这篇文章主要记录使用 beautifulsoup来解析我们想要获得字段。因为Beautifulsoup已经移植到bs4,所以要从这个模块引入。
官方文档:http://beautifulsoup.readthedocs.io/zh_CN/latest/
find_all( name , attrs , recursive , text , **kwargs )这个方法可以用遍历所有的文档并返回一个列表。 可以同get_text()来回去列表某个元素的内容,get('class')参数是属性名,来获得某个属性的内容
select()也是遍历文档树,并返回一个列表。其他使用方法同 find_all.唯一不同的是参数传递方法不同,如果select属性查找时还可以加入属性元素,属性需要用中括号括起来,注意属性和标签属于同一节点,所以中间不能加空格,否则会无法匹配到。 eg:soup.select('p[class="star"]') 等价于 soup.find_all('p','star')
思考:可以看到find_all方法被调用了,是否可以考虑用一个class来包装这个方法,通过传入的参数不同,用面向对象的方法来调用这个类。
def parse_one_page(soup): score_integer=soup.find_all('i','integer') score_fraction=soup.find_all('i','fraction') index=soup.find_all('i','board-index') actor=soup.find_all('p','star') time=soup.find_all('p','releasetime') #also can use select method #title=soup.select('a[class="image-link"]')[0].get('title') title=soup.find_all('a','image-link') image=soup.find_all('img','board-img') for i in range(len(title)): yield{ "index":index[i].get_text(), "title":title[i].get('title'), "actor":actor[i].get_text().strip()[3:], "time":time[i].get_text().strip()[5:], "score":score_integer[i].get_text()+score_fraction[i].get_text(), "image":image[i].get('data-src') }