- 创建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标签。