BeautifulSoup库是解析、遍历、维护“标签树”的功能库。
他的作用就是能获取到html里面的各个标签的内容。上次博客说的批量下载文件就可以靠它来解析页面批量获取url。

安装

ubuntu:

sudo pip install beautifulsoup4

windows:

pip install beautifulsoup4

使用

先看一个例子:

# coding: UTF-8
import requests
url="http://www.baidu.com"
r=requests.get(url)
r.encoding=r.apparent_encoding
print(r.text)

结果:

上面的代码以前写过,就是获取百度的源代码。现在我们就通过这个源代码来学习beautifulsoup库的使用吧。

soup.prettify()

对源代码进行美化(格式化)

# coding: UTF-8
import requests
from bs4 import BeautifulSoup

url="http://www.baidu.com"
r=requests.get(url)
r.encoding=r.apparent_encoding
#将源代码保存到变量s里面
s=r.text
soup=BeautifulSoup(s,"html.parser")
s=soup.prettify()
print(s)

结果:(确实好看多了,有整齐的缩进了)

from bs4 import 引入BeautifulSoup类

下面代码中构建了一个BeautifulSoup类型的对象,名为soup,参数为网页源代码和"html.parser",表明是解析html的。它还可以解析xml。

soup=BeautifulSoup(s,"html.parser")

上面的代码是通过字符串里面的源代码构建BeautifulSoup类对象,还可以像下面这样直接使用本地html文件创建BeautifulSoup类对象。

soup=BeautifulSoup(open("a.html"),"html.parser")

基本元素说明

例子

  • title

标题标签

print(soup.title)

结果:得到了title标签的文本内容

  • a

链接标签

print(soup.a)

结果:

tips:有多个时只返回第一个

  • name

显示标签的名字

print(soup.a.name)

  • parent

得到标签的父标签,是一个bs4.element.Tag对象。
我们可以通过获取子标签和父标签来遍历整个树。

int soup.a.parent.name
print(soup.a.parent.parent.name)
print(soup.a.parent.parent.parent.parent.parent.name)

  • attrs

得到标签属性,是一个字典

print(soup.a.attrs)

如果要获取字典中的一个值,可以通过:

print(soup.a.attrs["class"])

class是字典的一个key,返回它对应的value

print(soup.a.attrs["href"])

获取链接

tips:在python里面可以用type()获取变量的类型

  • string

获取尖括号之间的字符串

print(soup.a.string)

是一个bs4.element.NavigableString类型的对象

为了便于比较,附a的图:

  • 小结

html的遍历

contents

子节点的列表,list类型

soup=BeautifulSoup("<body><p>1111</p><p>2222</p></body>","html.parser")
print(soup.body.contents)

得到列表元素:

list=soup.body.contents
print(list[1])

tips:index从0开始,list[0],list[1]

children

得到标签的子节点,为listiterator(迭代)类型

for child in soup.body.children:
	print(child)

遍历儿子节点

parent

节点的父亲标签

parents

先辈标签的迭代类型

平行遍历

(同一个父节点的标签之间)

  • 总结