BeautifulSoup 是 Python 用来解析爬取的网页源代码的一个库,因其码的简洁性,因此应用得比较多。对于解析高度结构化的HTML,相比于正则表达式,用 BeautifulSoup 能更 快速便捷 地进行解析和提取。
安装BeautifulSoup库,如果是在pycharm中的话就用file->settings->project->project interpreter
,然后点击左下角的加号搜索 BeautifulSoup4
,点击安装库即可。
或者是在python安装目录下的 Scripts
,在地址栏输入 cmd 或者是 shift 加右键打开 powershell,拖动 pip.exe
到窗口中,再加上 install beautifulsoup4
,回车即可。(也不一定要在这个目录下面运行,不过得配置好环境变量,环境变量其实就是在电脑的任意位置,如果命令不在当前目录下能运行,就会自动搜索环境变量中的地址)
导入库的代码也有要注意的地方,就是导入的库包,用的是 eautifulsoup4 的缩写。
from bs4 import BeautifulSoup
我们以如下的源代码为例进行介绍。
res = '''
<html>
<body>
<h1 class = 'title'> 我是一级标题 </h1>
<h1 class = 'small_title'> 我是一级小标题 </h1>
<p> 文本内容 </p>
<a href = '我是网址'> 网址名称 </a>
</body>
</html>'''
1.获取特定标签的内容
首先导入 beautifulsoup 方法,然后设置 html.parser
HTML解析器。接着用解析器对象的 select
方法选取标签名为输入的参数的内容(注意:最后获取的结果是个列表)。
from bs4 import BeautifulSoup
soup = BeautifulSoup(res,'html.parser')
title = soup.select('h1')
print(title)
输出结果为:[<h1 class="title"> 我是一级标题 </h1>, <h1 class="small_title"> 我是一级小标题 </h1>]
想要获取这些结果中,除了头尾标签的中间的文本内容,可以把列表中的元素拿出来然后加上 .text
即可。
2.获取特定clss属性的内容
如果要获取特定class属性的内容,就需要把解析器对象传入的参数写为:'.class参数值'
,如下,我们要提取网页代码中的class属性为 title
的内容。
from bs4 import BeautifulSoup
soup = BeautifulSoup(res,'html.parser')
title = soup.select('.title')
print(title)
代码会把所有的class属性值为传入参数的内容都找出来,所以这个方法得结合前面找特定标签内容的方法结合起来,就能具体到某一类内容下,的某一属性值对应的方法。
特别的,id 属性的查找用 # 来声明,如下,找到id属性为 title
的内容:
data = soup.select('#title')
3.获取内容中的网址
前面说了获取含标签的内容,以及如何提取内容中不含标签的部分,而实际中有些信息是在标签里面的,比如,链接信息,那我们怎么去除文本内容只保留标签内容中的网址呢?用的是 返回内容['href']
,就是在返回的内容后加上 [href] 索引。
from bs4 import BeautifulSoup
soup = BeautifulSoup(res,'html.parser')
title = soup.select('a')
print(title[0]['href'])
注意:解析器返回的对象是一个列表,列表里面的对象才具有 "href" 这个参数,所以需要先把元素从列表中取出来。
4.多层次筛选
实际的代码常常是比较复杂的,需要的筛选条件也是多层次多条件的,有人会说,那就一层层把内容提取出来然后再筛选呗,其实 beautifulsoup 可以直接解析多层次的条件。
如:我要筛选属性值为 title 的区块代码下的 h1 标签的部分,可以写为:data = soup.select('.title h1')
。
只要在多个条件之间用空格隔开就好。同理,上面三个常用的解析函数可以灵活配合使用。
熟练掌握以上的技巧,就相当于是成功进入beautifulsoup的世界啦,希望对你有帮助。