Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.

1
2
3
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser') # 构造对象
print(soup.prettify()) # 以标准的缩进格式进行结构输出。
简单浏览结构化数据的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
soup.title
# <title>The Dormouse's story</title>
soup.title.name
# u'title'
soup.title.string
# u'The Dormouse's story'
soup.title.parent.name
# u'head'
soup.p
# <p class="title"><b>The Dormouse's story</b></p>
soup.p['class']
# u'title'
soup.a
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
soup.find_all('a')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
# <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
soup.find(id="link3")
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

从文档中找到所有<a>标签的链接:

1
2
3
4
5
for link in soup.find_all('a'):
print(link.get('href'))
# http://example.com/elsie
# http://example.com/lacie
# http://example.com/tillie

获取所有文字

1
print(soup.get_text())

安装解析器

可以选择安装第三方HTML解析器lxml

传入文件

1
2
soup = BeautifulSoup(open("index.html"))
soup = BeautifulSoup("<html>data</html>")

对象种类

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种: Tag , NavigableString , BeautifulSoup , Comment .

tag

1
2
3
4
5
# Tag 对象与XML或HTML原生文档中的tag相同:
soup = BeautifulSoup('<b class="boldest">Extremely bold</b>','lxml') # 第二个参数传解析器
tag = soup.b
type(tag) # <class 'bs4.element.Tag'>
print(tag) #<b class="boldest">Extremely bold</b>
tag的属性 name 和attributes

每个tag都有自己的名字,通过 .name 来获取:

1
2
3
tag.name # u'b'
tag.attrs # {u'class': u'boldest'}
tag.contents 属性可以将tag的子节点以列表的方式输出:
1
2
3
4
#一个tag可能有很多个属性(attributes). tag <b class="boldest"> 有一个 “class” 的属性,值为 “boldest” . tag的属性的操作方法与字典相同:

# 用字典方式取具体属性
tag['class'] # u'boldest'

字符串常被包含在tag内.Beautiful Soup用 NavigableString 类来包装tag中的字符串:

1
2
3
4
tag.string
# u'Extremely bold'
type(tag.string)
# <class 'bs4.element.NavigableString'>

BeautifulSoup

BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性来感受一下

Comment

注释对象

遍历文档树

直接子节点(要点:.contents .children 属性)

1
2
tag 的 .content 属性可以将tag的子节点以列表的方式输出
tag.children 它返回的不是一个 list,不过我们可以通过遍历获取所有子节点。

所有子孙节点 (.descendants)

1
contents 和 .children 属性仅包含tag的直接子节点,.descendants 属性可以对所有tag的子孙节点进行递归循环,和 children类似,我们也需要遍历获取其中的内容。

节点内容 (.string)

1
2
print soup.head.string
#The Dormouse's story

多个内容 (.strings .stripped_strings 属性)

1
2
3
4
5
6
7
.strings获取多个内容,不过需要遍历获取,
.stripped_strings 输出的字符串中可能包含了很多空格或空行,使用 .stripped_strings 可以去除多余空白内容
for string in soup.strings:
print(repr(string))
# u"The Dormouse's story"
# u'\n\n'
# u"The Dormouse's story"

父节点 ( .parent 属性)

全部父节点 (.parents 属性)

兄弟节点 (.next_sibling .previous_sibling 属性)

全部兄弟节点 (.next_siblings .previous_siblings 属性)

前后节点 (.next_element .previous_element 属性)

搜索文档树

####1)find_all( name , attrs , recursive , text , **kwargs )

find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件

CSS 选择器

写 CSS 时,标签名不加任何修饰,类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list