33老汉
一人一城
依旧王者风范
无论你或喜或不喜
我们都在见证最伟大的表演
莫要等他退役后
才后悔为何当初不能喜欢上他
PS:致敬人生中所有fighting的人!!!
今天探长和大家一起探讨一个常见的解析库,即BeautifulSoup解析库,探长将从什么是BeautifulSoup、BeautifulSoup的安装、常用解析器以及解析方法等几个方面进行分析。
Part 1 - 什么是BeautifulSoup库
BeautifulSoup是一个第三方python库,用于从HTML或XML文档中提取数据,与re正则相比,具有简单、便利、高效的特点,起到相互补充的作用。
Part 2 - BeautufilSoup的安装
如果你使用的是python原生环境,那么需要通过手动安装来获取BeautifulSoup库(因为是第三方库):
# 通过使用pip或easy_install来进行beautifulsoup库的安装
pip install beautifulsoup4
easy_install beautifulsoup4
如果你使用的是anaconda集成环境,由于beautifulsoup包含在其中,因此无需进行安装,可以直接操作使用。
Part 3 - beautifulsoup的解析器
使用beautifulsoup进行文档解析时需要解析器的配合,可以是python标准库中的解析器(html.parser),同样也支持第三方解析器,例如lxml等;如果你使用的是python原生环境,那么需要单独进行解析器的安装,如果你使用的是anaconda集成环境,那么无需安装,可以直接调用。
# lxml的安装
pip install lxml
easy_install lxml
# html5lib的安装
pip install html5lib
easy_install html5lib
常用的解析器有4个,分别是:python标准库、lxml HTML 解析器、lxml XML 解析器、html5lib库,它们分别有各自的优缺点:
由于lxml更高的效率,因此推荐使用lxml作为解析器。
Part 4 - html/xml文档的解析
文档的搜索方法可以查询出符合条件的所有标签元素或其属性,文档的遍历可以获取所有符合条件的子节点、父节点、兄弟节点等,而标签的选择只能获取符合条件的第一个对象及其属性值。
首先,探长先创建一个字符串,方便实际的演示操作:
html = '
James, you are great!
eastearn game
2018.05-26NBA东区决赛,骑士队取得了胜利
比赛中詹姆斯的出色发挥,感动了所有的人
让我们一起为他致敬!
'
4.1 文档节点及属性的获取(获取标签及属性)
# 首先需要构造一个beautifulsoup对象,以后的操作针对该对象进行操作
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
其中BeautifulSoup中第一个参数为需要解析的文档,第二个参数为需要使用的解析器,这里探长使用了lxml。
# 获取title标签及其属性-text和string方法
print(soup.title)
# 输出的结果为:James, you are great!
# 以上三种方法均可获得title标签的内容属性
# 输出的结果为:'James, you are great!'
# 获取p标签及其属性-attrs方法
print(soup.p)
# 输出的结果为:
2018.05.26NBA东区决赛,骑士队取得了胜利!
#注意此处仅仅输出了符合条件的第一个对象,而不是全部对象
print(soup.p.attrs['class'])
print(soup.p['class'])
# 以上两种方法均可获得p标签的class属性
# 如果对象具有多个属性,那么以列表形式返回,如果有1个属性那么返回字符串
# 输出结果为:['title', 'qishi']
print(soup.p.text)
print(soup.p.string)
print(soup.p.get_text())
# 输出结果为:'2018.05.26NBA东区决赛,骑士队取得了胜利!'
4.2 遍历文档(获取子孙等节点)
# 获取html标签的子节点-contents方法和children方法
print(item)
# 以上两种方法,即contents方法、children方法均可获取html标签的所有子节点
# 区别在于contents以列表形式返回所有对象,而children以生成器的形式返回。
# 获取所有的子孙节点-descendants方法
print(item)
# descendants方法与children方法类似,返回的同样是一个生成器对象
# 获取父节点-parent方法
# 获取所有祖先节点-parents方法
# 获取兄弟节点-next_sibling/previous_sibling/next_silbings/previous_siblings
兄弟节点是与目标节点同级的节点,其中next_silbing和previous_sibling分别是获取后面和前面一个兄弟元素节点,而next_siblings和previous_siblings分别是获取后面和前面所有的兄弟元素节点
for item in soup.p.next_siblings:
print(item)
print(soup.p.next_sibling)
# 以上两个分别输出p标签的后面所有的兄弟节点以及后面一个兄弟节点
4.3 搜索文档(获取符合条件的所有节点)
这里探长介绍find_all以及css选择器两种方法,find方法与find_all类似,其中find_all方法是以列表形式返回符合条件的所有节点,find方法仅返回符合条件的第一条结果,css选择器是通过soup.select()方法,调用css选择器的语法搜索符合css语法的所有节点
# find_all方法获取所有符合条件的对象
find_all使用方法为:find_all(name, attrs, recursive, string, **kwargs),其中name参数为按照标签的名字进行搜索查找,attrs参数为按照属性进行查找,recursive参数为是否搜索所有的子孙节点(find_all方法默认搜索所有子孙节点,如果仅想查询子节点,那么可以设置为recursive=False),string参数为按照字符串内容进行查找,limit参数为设置查找的数量,如果limit=3那么仅返回符合条件的前3项结果
print(soup.find_all('p'))
# 基于name参数的查找
# 以列表形式返回所有符合条件的节点
for item in soup.find_all('p'):
print(item.text)
# 返回所有符合条件的节点的文本内容
print(soup.find_all('p', attrs={'class': 'title'}))
# 基于name参数、attrs参数的综合查找
# 同样以列表形式返回所有符合条件的结果
# css选择器-select方法
css选择器的使用方法为soup.select(),里面字符串为css选择器的语法,在css选择器语法中.号代表class属性,#号代表id属性,空格表示下面的层级,没有空格表示本层级
print(soup.select('html p.title'))
# 以列表形式返回所有符合条件的节点
for item in soup.select('html p.title'):
print(item.text)
print(item.string)
print(item.get_text())
# 以上三种方法,即text\string\get_text(),均返回所有节点的内容
for item in soup.select('html p.title'):
print(item.attrs['class'])
print(item['class'])
# 以上两种方法,即item.attrs[]\item[],均返回所有节点的class属性值
# 其他搜索方法
除了以上两种搜索方法外,还存在着其他的所有方法,例如用于查找所有祖先节点的find_parents方法、用于查找父节点的find_parent方法、用于查找后面的兄弟节点的find_next_siblings/find_next_sibling方法、用于查找前面的兄弟节点的find_previous_siblings/find_previous_sibling方法等。
以上就是常用解析库beautifulsoup的使用方法,探长希望能够帮助到你!如有任何问题,欢迎与探长联系(在探长交流-->学习交流中可以加探长微信),或者进行留言互动!
茫茫人海中 期待与你相遇 在你我最美丽的时刻
领取专属 10元无门槛券
私享最新 技术干货