BeautifulSoup常用解析库-爬虫干货系列5

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的使用方法,探长希望能够帮助到你!如有任何问题,欢迎与探长联系(在探长交流-->学习交流中可以加探长微信),或者进行留言互动!

茫茫人海中 期待与你相遇 在你我最美丽的时刻

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180526G1CWHU00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券