BeautifulSoup就是Python的一个HTML或XML的解析库,可以用它来方便地从网页中提取数据。官方解释如下:
Beautiful Soup提供一些简单的、Python式的函数来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为UTF-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的Python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
所以说,利用它可以省去很多烦琐的提取工作,提高了解析效率。
一、模块安装
使用之前,需要确保已经安装好了BeautifulSoup和lxml模块。
pip install beautifulsoup4 lxml
二、解析器选择
Beautiful Soup在解析时实际上依赖解析器,它除了支持Python标准库中的HTML解析器外,还支持一些第三方解析器(比如lxml)。下表为BeautifulSoup支持的解析器:
解析器使用方法优势劣势
Python标准库
BeautifulSoup(markup, "html.parser")
Python的内置标准库、执行速度适中、文档容错能力强
Python 2.7.3及Python 3.2.2之前的版本文档容错能力差
lxml HTML解析器
BeautifulSoup(markup, "lxml")
速度快、文档容错能力强
需要安装C语言库
lxml XML解析器
BeautifulSoup(markup, "xml")
速度快、唯一支持XML的解析器
需要安装C语言库
html5lib
BeautifulSoup(markup, "html5lib")
最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档
速度慢、不依赖外部扩展
通过以上对比可以看出,lxml解析器有解析HTML和XML的功能,而且速度快,容错能力强,所以推荐使用它。
如果使用lxml,那么在初始化Beautiful Soup时,可以把第二个参数改为lxml即可:
from bs4 importBeautifulSoup
soup= BeautifulSoup('
Hello
', 'lxml')print(soup.p.string)三、基本用法
from bs4 importBeautifulSoupimportrequests, re
req_obj= requests.get('https://www.baidu.com')
soup= BeautifulSoup(req_obj.text, 'lxml')'''标签查找'''
print(soup.title) #只是查找出第一个
print(soup.find('title')) #效果和上面一样
print(soup.find_all('div')) #查出所有的div标签
'''获取标签里的属性'''tag=soup.divprint(tag['class']) #多属性的话,会返回一个列表
print(tag['id']) #查找标签的id属性
print(tag.attrs) #查找标签所有的属性,返回一个字典(属性名:属性值)
'''标签包的字符串'''tag=soup.titleprint(tag.string) #获取标签里的字符串
tag.string.replace_with("哈哈") #字符串不能直接编辑,可以替换
'''子节点的操作'''tag=soup.headprint(tag.title) #获取head标签后再获取它包含的子标签
'''contents 和 .children'''tag=soup.bodyprint(tag.contents) #将标签的子节点以列表返回
print([child for child in tag.children]) #输出和上面一样
'''descendants'''tag=soup.body
[print(child_tag) for child_tag in tag.descendants] #获取所有子节点和子子节点
'''strings和.stripped_strings'''tag=soup.body
[print(str) for str in tag.strings] #输出所有所有文本内容
[print(str) for str in tag.stripped_strings] #输出所有所有文本内容,去除空格或空行
'''.parent和.parents'''tag=soup.titleprint(tag.parent) #输出便签的父标签
[print(parent) for parent in tag.parents] #输出所有的父标签
'''.next_siblings 和 .previous_siblings
查出所有的兄弟节点'''
'''.next_element 和 .previous_element
下一个兄弟节点'''
'''find_all的keyword 参数'''soup.find_all(id='link2') #查找所有包含 id 属性的标签
soup.find_all(href=re.compile("elsie")) #href 参数,Beautiful Soup会搜索每个标签的href属性:
soup.find_all(id=True) #找出所有的有id属性的标签
soup.find_all(href=re.compile("elsie"), id='link1') #也可以组合查找
soup.find_all(attrs={"属性名": "属性值"}) #也可以通过字典的方式查找