Beautiful Soup的简介
简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:
开启Beautiful Soup 之旅
在这里先分享官方文档链接,不过内容是有些多,也不够条理,在此本文章做一下整理方便大家参考。
官方文档
创建 Beautiful Soup 对象
首先必须要导入 bs4 库
from bs4 import BeautifulSoup
我们创建一个字符串,后面的例子我们便会用它来演示
html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
另一种方法:利用urllib来获取网页文档。
response=urllib.request.Request(url=url,headers=headers)
webPage=urllib.request.urlopen(response)
req_obj = webPage.read().decode('utf-8')
html=response.read()
soup = BeautifulSoup(req_obj,'html5lib')
另外,我们还可以用本地 HTML 文件来创建对象,例如
soup = BeautifulSoup(open('index.html'))
上面这句代码便是将本地 index.html 文件打开,用它来创建 soup 对象
下面我们来打印一下 soup 对象的内容,格式化输出
print soup.prettify()
输出:就是上面HTML中的所有内容。
四大对象种类
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:
- Tag
- NavigableString
- BeautifulSoup
- Comment
(1)Tag
Tag 是什么?通俗点讲就是 HTML 中的一个个标签,例如:
<title>The Dormouse's story</title>
,
<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
上面的 title a 等等 HTML 标签加上里面包括的内容就是 Tag,下面我们来感受一下怎样用 Beautiful Soup 来方便地获取 Tags
下面每一段代码中注释部分即为运行结果:
soup = BeautifulSoup(html)
print(soup.title)
print(soup.a)
print(soup.p)
'''
输出:
<title>The Dormouse's story</title>
<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
'''
它查找的是在所有内容中的第一个符合要求的标签,
我们可以验证一下这些对象的类型
print(type(soup.title))
'''
输出:
<class 'bs4.element.Tag'>
'''
对于 Tag,它有两个重要的属性,是 name 和 attrs,下面我们分别来感受一下:
name:
soup 对象本身比较特殊,它的 name 即为 [document],对于其他内部标签,输出的值便为标签本身的名称。
soup = BeautifulSoup(html)
print(soup.name)
print(soup.head.name)
'''
输出:
[document]
'''
attrs
soup = BeautifulSoup(html)
print(soup.p.attrs)
'''
输出:
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
上面是定义的P;下面是输出的内容:
{'class': ['title'], 'name': 'dromouse'}
'''
在这里,我们把 p 标签的所有属性打印输出了出来,得到的类型是一个字典。
如果我们想要单独获取某个属性,可以这样,例如我们获取它的 class 叫什么
soup = BeautifulSoup(html)
print(soup.p['class'])
'''
输出:
['title']
'''
还可以这样,利用get方法,传入属性的名称,二者是等价的
soup = BeautifulSoup(html)
print(soup.p.get('class'))
'''
输出:
['title']
'''
我们可以对这些属性和内容等等进行修改,例如
soup.p['class']="newClass"
print (soup.p)
'''
输出:
<p class="newClass" name="dromouse"><b>The Dormouse's story</b></p>
'''
还可以对这个属性进行删除,例如
del (soup.p['class'])
print (soup.p)
'''
输出:
<p class="newClass" name="dromouse"><b>The Dormouse's story</b></p>
'''
不过,对于修改删除的操作,不是我们的主要用途,在此不做详细介绍了,如果有需要,请查看前面提供的官方文档
(2)NavigableString
既然我们已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可,例如
print (soup.p.string)
print (type(soup.p.string))