前言:本文我们系统的对beautifulsoup的用法做一个归纳总结。尽量涵盖其所有方面。以后再遇到beautifulsoup的问题,请查阅本文。
参考地址:Python爬虫入门之BeautifulSoup
【beautifulsoup是用来做什么的】
首先,我们回顾一下beautifulsoup的作用。
我们接触到这个Python模块,是在写Python爬虫脚本时。
用来分析所抓取网页的HTML代码,以方便的从大量的HTML代码中找到我们所需要的数据信息。
比单纯使用正则表达式,方便了许多。
【构造soup对象】
以我们之前写过的诸多代码做基础,构造一个soup对象出来,然后才能够进行解析。
from bs4 import BeautifulSoup
mainUrl="http://www.bilibili.com/online.html"
'''进入在线列表页面''' resp=urllib2.urlopen(mainUrl)
html = resp.read().decode('utf-8').encode('gbk') soup = BeautifulSoup(html, "html.parser", from_encoding="gbk")构造成功。将返回的网页代码构造为一个可以解析的soup对象。
【拿到第一个标签的内容】
我们可以通过指定soup对象的标签,拿到该标签的第一个内容。如:
soup = BeautifulSoup(html, "html.parser", from_encoding="gbk") print soup.title打印结果如下:
我们发现乱码了,可以将其转换为string类型然后在decode一下
print str(soup.title).decode('utf-8')打印结果如下:
这种soup.tag的方式,只能够拿到html代码中的第一个标签的内容。
【Tag的属性】
每个Tag,都有两个重要的属性,name和attrs
print soup.p print soup.p.name print soup.p.attrs
打印出的结果如下:
銆愮洏鐐广�戣繎骞村湪B绔欑湅涓嶅埌鐨�8澶у己鐣�
name,即是标签名
attrs,顾名思义是属性的意思,打印出改tag所具有的属性名以及属性值。
什么算一个标签呢?
这就算一组标签了,其中再加上class="etitle",这就属于p标签的一个属性,我们还可以给标签添加更多的属性及对应的属性值。当然,很多标签实际使用时,大多是有属性的。
【获取某标签的某属性值】
我们知道了一个标签可能会有很多个属性,对应也会有很多个属性值。
如果我们想取得确定属性的值。怎么做呢?
print soup.p['class']直接打印出属性值:[u'etitle']
【获取标签内部的字符串】
使用.string
print str(soup.p).decode('utf-8') print soup.p.string打印结果如下:
【盘点】近年在B站看不到的8大强番
我们发现,直接打印p.string,不乱码
【获取标签的所有内容】
直接打印soup.tag只能拿到第一个,接下来我们来拿到所有!
使用soup对象的find_all函数
print soup.find_all('p') print len(soup.find_all('p'))打印结果如下:
[
\u301。。。 bc1\uff1a0910417
]打印出了所有的p标签内容。共45个p标签。
【find_all函数的使用】
我们可以使用find_all函数找到所有标签,当然也可以根据标签名以及属性来找到我们需要的标签。
这时需要在find_all函数中传递对应参数。
【name参数】
传字符串:
print soup.find_all('p')
传正则表达式:
print soup.find_all(re.compile('^b'))传递正则表达式时,需要引入Python的re模块。
import re
提供对正则表达式的支持
传列表:
print soup.find_all(['p','head'])查出p标签和head标签的所有内容。即,同时查多种标签。
当然还可以传别的,这里不再赘述。基本用不到的就不说了。
【keyword函数】
按属性以及属性值来搜索值。
print soup.find_all(class_="ebox") print len(soup.find_all(class_='ebox'))打印结果如下:
[
]共20个ebox。
【注意】这里注意,因为class是Python的关键词,所以在class后加下划线
这里虽然能够找出来,但find_all函数有一个问题,就是中文编码。
我们之前使用find_all函数寻找所需要的数据的时候,中文总是乱码。find_all这个函数会把查出来的字符串搞乱,所以是有一定局限性的。
甚至最终我们都没有使用find_all函数!
【CSS选择器】
我们最终决定使用的是soup.select函数,又叫CSS选择器。
我们使用CSS选择器来寻找符合要求的数据。
soup.select()找到的数据,返回为list类型,即,寻找到的是所有符合要求的数据。
查找方式如下:
【通过标签名查找】
print soup.select('div')
直接返回所有div标签的所有内容
【通过类名查找】
print soup.select('.ebox') print len(soup.select('.ebox')). 这个点表示查询class="ebox"的,所有标签内容
可以查询出20条数据。
【通过id名查找】
print soup.select('#index_nav')【组合查找】
print soup.select('div #index_nav')表示寻找div标签中id为index_nav的标签内容。
【属性查找】
这也是我们最后选定的查找方式,为最佳查找方式。
即,指定标签与属性名和属性值。确定最终数据内容。
print soup.select('p[class="etitle"]') print soup.select('.etitle')虽然,和直接查找类的结果相同,这里同时指定标签名和属性名值,更加精确!
所以我们多次采用了这种方式!
data=soup.select('div[class="ebox"]')
data=soup.select('span[class="author"]')
data=soup.select('span[class="dm"]')
至此,我们记住,使用soup的select函数来查找HTML网页数据!