bs4必备基础知识

bs4

快速方便简单的提取网页中指定的内容,给定一个网页字符串,然后使用他的接口将网页字符串生成一个对象,然后通过这个对象的方法来提取数据

一.安装bs4

pip install bs4
或pycharm编辑器中的settng设置查找、安装bs4

二.安装解析器parser

Beautiful Soup支持 Python标准库中的 HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup, “html.parser”) Python的内置标准库、执行速度适中、文档容错能力强 Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
lxml HTML解析器 BeautifulSoup(markup, “lxml”) 速度快、文档容错能力强 需要安装C语言库
lxml XML解析器 BeautifulSoup(markup, “xml”)、BeautifulSoup(markup, [“lxml-xml”]) 速度快、唯一支持xml的解析器 需要安装C语言库
html5lib BeautifulSoup(markup, “html5lib”) 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 速度慢,不依赖外部扩展

注意:如果一段HTML或XML文档格式不正确的话,那么在不同的解析器中返回的结果可能是不一样的

解析器之间的区别

三.bs4对象的转换

将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象

from bs4 import BeautifulSoup
# 获得文档对象 - soup
soup = BeautifulSoup(open(文档路径, encoding=编码格式),features=解析器)

或传入字符串或文件句柄

# 传入字符串
soup = BeautifulSoup('liyuhong', features='lxml')
# 输出<html><body><p>liyuhong</p></body></html>

# 传入文件句柄
soup = BeautifulSoup('<html>liyuhong</html>')
# 输出<html><body><p>liyuhong</p></body></html>

解析过程:

  • 文档被转换成Unicode,并且HTML实例都被转换成Unicode编码
  • BeautifulSoup选择最合适的解析器来解析这段文档,如果手动指定解析器,那么BeautifulSoup会选择指定解析器来解析指定文档

注意:默认解析器情况下,BeautifulSoup会将当前文档作为HTML格式解析,如果要解析XML文档,需要指定"xml"解析器

四. 对象的种类

BeautifulSoup将复杂的HTML文档解转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种:Tag, NavigableString, BeautifulSoup, Comment

1.Tag(标签)

tag对象与XML或HTML原生文档中的tag相同
普通标准操作:

soup = BeautifulSoup('<a>liyuhong</a>', features='lxml')
tag_soup = soup.a
print(type(tag_soup))
<class 'bs4.element.Tag'>
*tag的属性

tag中最重要的属性:name和attributes

(1).每个tag都有自己的名字,通过.name来获取

普通标准操作:

soup = BeautifulSoup('<a>liyuhong</a>', features='lxml')
print(soup.a)
print(soup.a.name)
<a>liyuhong</a>
a

tag.name值的改变(将改变HTML文档):

soup.a.name = "p"
print(soup.a)
print(soup.p)
None
<p>liyuhong</p>
(2).一个tag可能有多个属性,操作与字典相同,通过.attrs来获取

普通标准操作:

soup = BeautifulSoup('<a class="celebrity">liyuhong</a>', features='lxml')
# 字典操作
soup.a.attrs['class']
# 或直接取点属性
soup.a.attrs
['celebrity']
{'class': ['celebrity']}

tag.attrs的改变(改、增、删):

soup = BeautifulSoup('<a class="celebrity">li</a>', features='lxml')
# 直接打印源tag
print(soup.a)
<a class="celebrity">li</a>
# 1.改变属性的值
soup.a.attrs['class'] = 'lyh'
print(soup.a)
<a class="lyh">li</a>
# 2.添加属性的值
soup.a.attrs['id'] = 'li'
print(soup.a)
<a class="celebrity" id="li">li</a>
# 3.删除属性的值
del soup.a.attrs['class']
<a>li</a>

多值属性:

soup = BeautifulSoup('<a class="celebrity liyuhong">li</a>', features='lxml')
print(soup.a)
print(soup.a.attrs['class']
# 两个值的class属性
<a class="celebrity liyuhong">li</a>
['celebrity', 'liyuhong']

2.NavigableString(标签的值)

字符串常包含在tag内。BeautifulSoup常用NavigableString类来包装tag中的字符串。

普通标准用法:

soup = BeautifulSoup('<a class="celebrity liyuhong">li</a>', features='lxml')
print(soup.a.string)
print(type(soup.a.string))
li
<class 'bs4.element.NavigableString'>

tag中值的替换:
tag中包含的字符串不能被编辑,但是可以被替换成其他字符串,用replace_with()方法

soup = BeautifulSoup('<a class="celebrity liyuhong">li</a>', features='lxml')
soup.a.string.replace_with('UFO')
print(soup.a.string)
print(soup.a)
UFO
<a class="celebrity liyuhong">UFO</a>

3.BeautifulSoup(文档)

表示的是一个文档的全部内容。.name属性包含一个为"[document]"的特殊值。

print(soup.name)
print(type(soup))
[document]
<class 'bs4.BeautifulSoup'>

4.Comment(注释及特殊字符串)

特殊类型的NavigableString

普通标准操作:

soup = BeautifulSoup('<a><!--who is your daddy?--></a>', features='lxml')
print(type(soup.a.string))
<class 'bs4.element.Comment'>

五.bs4语法

(1).获取属性

# 获取p标签的属性
# 方法一
soup.p.attrs(返回字典)  or soup.p.attrs['class'](class返回列表,其余属性返回字符串)
# 方法二
soup.p['class'](class返回列表,其余属性返回字符串)
# 方法三
soup.p.get('class')(class返回列表,其余属性返回字符串)

(2).获取文本

# 获取标签的值的三种方法
soup.p.string
soup.p.text
soup.p.get.text()

注意:当标签的内容还有标签时,string方法返回为None,而其他两个方法获取纯文本内容

(3).find方法

返回一个对象

soup.find('a')
soup.find('a', class_='xxx')  # 注意class后的下划线
soup.find('a', title='xxx')
soup.find('a', id='xxx')
soup.find('a', id=compile(r'xxx'))

注意:find只能找到符合要求的第一个标签,他返回的时一个对象

(4).find_all方法

返回一个列表,列表里时所有符合要求的对象

soup.find_all('a')
soup.find_all(['a','span'])   #返回所有的a和span标签
soup.find_all('a', class_='xxx')
soup.find_all('a', id=compile(r'xxx'))
# 提取出前两个符合要求的
soup.find_all('a', limit=2)

(5).select方法

返回列表。类似CSS写法来筛选元素,标签名不加任何修饰,类名加点,id名加#
<1> 通过标签名查找

soup.select('a')
soup.select('a, span')   # 注意引号的位置

<2> 通过类名查找

soup.select('.class')

<3> 通过id名查找

soup.select('#id')

<4> 通过子标签查找

# 直接子元素(必须相邻)
soup.select('body > div >a')

# 间接子元素(不需相邻)
soup.select('body a')

<5> 组合查找
标签名、类名、id名进行组合,空格隔开

soup.select('a #id')

<6> 属性查找

soup.select('a[href="https://www.baidu.com"]')

参考文档:
Beautiful Soup 4.4.0 文档
爬虫—bs4语法

更新中…

发布了45 篇原创文章 · 获赞 1 · 访问量 2443

猜你喜欢

转载自blog.csdn.net/weixin_44225602/article/details/100130761
BS4