- 创建BeautifulSoup对象的两种方式:
- 从字符串创建:
soup = BeautifulSoup(html_str,'html.parser')
- 从html文件创建:
soup = BeautifulSoup(open('xx.html'))
- 解析器比较
解析器 | 优势 |
---|---|
"html.parser" | python内置标准库;速度适中;容错强 |
"lxml" | 速度快;容错强;需要pip install lxml
|
"xml" | 速度快;支持XML的解析器 |
"html5lib" | 容错性最强;生成HTML5格式的文档;速度慢 |
常用对象
Tag
- 与HTML或XML中的
Tag
相同,就是标签,有两个重要属性:name
和attributes
-
name
抽取方式:<Tag>.name
(Beautiful对象也可以看作是一个Tag) -
attributes
抽取方式:<Tag>.attrs
可以拿到标签的所有属性,返回一个dict
如果要提取某个属性(比如class
属性)的值,可以用<Tag>.get('class')
或者<Tag>['class']
,返回一个列表。
NavigableString
获取标记内部的文字:<Tag>.string
遍历文档树
-
<Tag>.contents
的方式可以将Tag的子节点以列表的形式输出;<Tag>.children
同理,但是输出的是一个生成器,可以用循环来读取。<Tag>.decendants
可以对tag的所有子孙节点都循环递归出来。 -
<Tag>.parent
可以获得某个元素的父节点,<Tag>.parents
则得到所有的父辈节点(与decendants
一致) -
<Tag>.next_siblings
可以迭代出该节点后面的所有兄弟节点。(处于同一个父节点下面的)
检索方法
-
find_all()
方法
函数原型:find_all(name, attrs, recursive, text, **kwargs)
1.name
参数——标签名。
直接传入标签名的字符串即可,也支持传入一个字符串数组。
可以传入一个正则表达式,比如re.compile('^b')
可以检索到以b
开头的标记比如body
,b
,br
-
kwargs
参数——可以传入id
,href
,_class
(因为python中已有class
作为保留字,故用_class
代替class
)等属性。
比如soup.find_all('a', class_= 'sister', id = 'link')
就是说找a
标签,class
属性为'sister,id
为'link'的标签;
href = True
则搜索包含href
属性的标签;
另外,同样支持传入一个正则表达式;
如果某些html5里面的值不能用id = 'x'来表达,那么可以传入attrs = {'id' : 'x'}
来表示。
3.limit参数:可以用来限定返回个数,比如设置为limit =2 返回两个值。
4.recursive参数:迭代,默认为True,若设置为False则只返回子节点内的搜索。
-
CSS选择器
1.用soup.select(Tag)来找标签,返回是一个标签列表,比如soup.select('p')
可以找到所有段落。soup.select('img')找到所有图片。
- 常见是
' '
表示标签,'.xxx'
表示CSS class xxx属性。'div span'
表示所有在div
元素之内的span
元素。'div>span'
表示直接在div下一级的span 。#comic
表示带有id属性为comic的元素。'.t'
代表class属性为t的元素。 - 是否存在某个属性来查找:
'a[href]'
可以查找出所有带有href属性的a标签。