Beautiful Soup 是⼀个可以从HTML或XML⽂件中提取数据的Python库,它可以通过你喜欢的转换器实现惯⽤的⽂档导航,查找,修改⽂档的⽅式. Beautiful Soup是利⽤此关系:HTML的属性都具有结构上的层级关系, ⽽且有css和id属性,来进⾏提取的
1.2解析器使用BeautifulSoup解析代码,能够发出一个BeautifulSoup的对象,并按照标准的缩进格式的输出结构 Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,一般常用lxml HTML 解析器
解析器使用方法优势劣势Python标准库BeautifulSoup(markup, “html.parser”)Python的内置标准库、执行速度适中、文档容错能力强Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差lxml HTML 解析器BeautifulSoup(markup, “lxml”)速度快、文档容错能力强需要安装C语言库lxml XML 解析器BeautifulSoup(markup, [“lxml”, “xml”])、BeautifulSoup(markup, “xml”)速度快、唯一支持XML的解析器需要安装C语言库html5libBeautifulSoup(markup, “html5lib”)最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档速度慢、不依赖外部扩展 2、Beautiful Soup包的安装与导⼊Beautiful Soup包的安装
pip install bs4
Beautiful Soup包的导⼊
from bs4 import BeautifulSoup
3、中文文档
https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
4、构建对象Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:Tag、NavigableString、BeautifulSoup、Comment . BeautifulSoup 对象表示的是一个文档的全部内容。大部分时候,可以把它当作 Tag 对象,它支持 遍历文档树 和 搜索文档树 中描述的大部分的方法。
5、一个简单的Beautiful Soup例子 5.1获取网页源码#导入所需要的包
import requests
from bs4 import BeautifulSoup
#网址
url = "网页网址"
#构造虚拟浏览器
headers ={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
}
r = requests.get(url,headers=headers)
# 给encoding属性重新赋值, 用推测的编码去解析网页内容
r.encoding = r.apparent_encoding
#查看网页源代码
r.text
结构很乱,很难看明白
#查看源码类型,是文本类型
type(r.text)
# 为了在这个字符串中高效的搜索出我们需要的内容
# 利用BeautifulSoup 将这个字符串改变成BeautifulSoup类型
bs = BeautifulSoup(r.text,"lxml")
#查看bs类型
type(bs)
bs中内容变得规整,符合HTML的页面结构,方便阅读
find_all :搜索出网页中所有符合你的参数要求的内容,返回的数据类型是列表,即使只有一个符合要求的,也会将这唯一的一个放入到列表中 find : 搜索出网页中第一个符合你的参数要求的内容。一般来说,当你已知只有一个符合参数要求的内容的时候,直接使用find就可以。
bs.title # bs.标签名 这种方法很少用,默认返回第一个
bs.find_all('title')
# find 就是搜索出第一个符合要求的结果
bs.find('title')
bs.a
# 搜索出所有的a标签内容
bs.find_all('a')
bs.find('a')
# 查看类型
# 把整个网页叫做BeautifulSoup,从整个网页中搜索出的其中一个标签,叫做Tag;
# 但是这两种本质上功能没有什么区别
type(bs.find('a'))
# 属性名称 = 属性的值
# 在python中, class是一个关键字, 所有class后面需要加一个_,以便和关键字进行区分
# 因为我们用的最多的事class, 所以当你搜索的是class的时候, 这个参数可以省略
bs.find('div', class_ = 'intro')
bs.find('div', 'intro')
# 以上两种写法返回结果相同
# 获取tap中的文本 , text属性
bs.find('div', 'intro').text
# 通过limit 参数限制返回的条数
bs.find_all('a',limit = 2)
# 通过标签内的文本进行定位,获取文本是大主宰的链接
bs.find_all('a',text = '大主宰')
# 可以将tag中的属性理解成字典中的键值对
bs.find('a',text = '大主宰')['href']