python爬虫之bs4模块(超详细)
一、bs4简介
二、使用方法
三、BeautifulSoup四大对象种类
(1)tag
(2)NavigableString
(3)BeautifulSoup
(4)Comment
四、CSS选择器
一、bs4简介
即BeautifulSoup,是python种的一个库,最主要的内容就是从网页中抓取数据。
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
二、使用方法
1.首先导入bs4库
from bs4 import BeautifulSoup
1
2.然后我们利用requests或者urllib2来打开一个网址(这里以https://www.baidu.com为例)
import requests
url = "https://www.baidu.com"
r1 = requests.get(url,'lxml')
r1.encoding='utf-8'
#print (r1.text)
1
2
3
4
5
输出结果:
python bs4
3.创造一个BeautifulSoup对象
bs_1=BeautifulSoup(r1.text,'lxml')
#print(bs_1)
1
2
两个参数:第一个参数是要解析的html文本,第二个参数是使用那种解析器,对于HTML来讲就是html.parser,这个是bs4自带的解析器。
如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的。
解析器 使用方法 优势
python标准库 BeautifulSoup(html, “html.parser”) 1、Python的内置标准库
2、执行速度适中
3、文档容错能力强
lxml HTML BeautifulSoup(html, “lxml”) 1.速度快
2.文档容错能力强
lxml XML BeautifulSoup(html, [“lxml”, “xml”]) BeautifulSoup(html, “xml”) 1.速度快
2.唯一支持XML的解析器
html5lib BeautifulSoup(html, “html5lib”) 1.做好的容错性
2.以游览器的方式解析文档
3.生成HTML5的文档
4.然后通过这个对象来实现对获取到的源码进行筛选和处理
print(bs_1.prettify()) #格式化输出全部内容
print(bs_1.标签名)
#标签名有html,head,title,meta,body,script,style等等
1
2
3
4
5
三、BeautifulSoup四大对象种类
Beautiful Soup 将复杂HTML文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为4种
(1)tag
Tag对象与 xml 或 html 原生文档中的 tag 相同。
bs_1=BeautifulSoup(r1.text,'lxml')
tag = bs_1.head
print(type(tag))
#
1
2
3
4
如果不存在,则返回 None,如果存在多个,则返回第一个。
Name :每个 tag 都有自己的名字
tag.name
# 'head'
1
2
Attributes:tag 的属性是一个字典
tag['class']
# 'boldest'
tag.attrs
# {'class': 'boldest'}
type(tag.attrs)
#
1
2
3
4
5
6
7
8
多值属性:最常见的多值属性是class,多值属性的返回 list
soup = BeautifulSoup('
')
print(soup.p['class']) # ['body', '']
print(soup.p.attrs) # {'class': ['body', 'aaa']}
1
2
3
4
5
如果某个属性看起来好像有多个值,但在任何版本的HTML定义中都没有被定义为多值属性,那么Beautiful Soup会将这个属性作为字符串返回。
a1 = BeautifulSoup('
', 'html.parser')print(a1.p['id']) # 'my id'
1
2
Text:返回 tag 的所有字符串连成的字符串
其他方法
tag.has_attr('id') #返回 tag 是否包含 id 属性
1
以上代码还可以写成 ’ id ’ in tag.attrs 的形式,之前说过,tag 的属性是一个字典。
(2)NavigableString
字符串常被包含在 tag 内,Beautiful Soup 用 NavigableString 类来包装 tag 中的字符串。但是字符串中不能包含其他 tag。
a1 = BeautifulSoup('bbb')
s = a1.b.string
print(s) # bbb
print(type(s)) #
1
2
3
4
5
6
7
(3)BeautifulSoup
BeautifulSoup 对象表示的是一个文档的全部内容。大部分时候,可以把它当作 Tag 对象。但是 BeautifulSoup 对象并不是真正的 HTM L或 XML 的 tag,它没有attribute属性,name 属性是一个值为“[document]”的特殊属性。
(4)Comment
comment一般表示文档的注释部分
a1 = BeautifulSoup("")
comment = a1.b.string
print(comment) # This is a comment
print(type(comment)) #
1
2
3
4
5
6
7
四、CSS选择器
css的规则:
标签名不加任何修饰,类名前加点,id名前加#,在这里用的方法大致是一样的,用到的方法是bs_1.select(),它的返回值是一个列表list
通过标签名字
print bs_1.select('title')
1
通过类名
print bs_1.select('.class')
1
通过id
print bs_1.select('#a_1')
1
组合查找
这里和在写css的格式是一样的
print bs_1.select('.class #id')
#意思是查找.class类下的id是id的元素
1
2
3
子查询
print bs_1.select('head > title')
1
属性查找
print bs_1.select(p[class="new"])