Beautiful Soup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象,所有对象可以归纳为 4 种: Tag、NavigableString、BeautifulSoup、Comment,Attribute 。
Tag
通俗点讲就是 HTML 中的一个个标签。
NavigableString
:获取标签内部的文字,如,soup.p.string
。
BeautifulSoup
:表示一个文档的全部内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag。
Comment:Comment
对象是一个特殊类型的 NavigableString
对象,其输出的内容不包括注释符号,但是如果不好好处理它,可能会对我们的文本处理造成意想不到的麻烦。
装载BeautifulSoup
from bs4 import BeautifulSoup import requests url = 'http://python123.io/ws/demo.html' r = requests.get(url) demo = r.text # 服务器返回响应 soup = BeautifulSoup(demo, "html.parser") """ demo 表示被解析的html格式的内容 html.parser表示解析用的解析器 """ print(soup) # 输出响应的html对象
输出结果
print(soup.title) # 获取html的title标签的信息 print(soup.a) # 获取html的a标签的信息(soup.a默认获取第一个a标签,想获取全部就用for循环去遍历) print(soup.a.name) # 获取a标签的名字 print(soup.a.parent.name) # a标签的父标签(上一级标签)的名字 print(soup.a.parent.parent.name) # a标签的父标签的父标签的名字
输出结果
Basic Python
a
p
body
print('a标签类型是:', type(soup.a)) # 查看a标签的类型 print('第一个a标签的属性是:', soup.a.attrs) # 获取a标签的所有属性(注意到格式是字典) print('a标签属性的类型是:', type(soup.a.attrs)) # 查看a标签属性的类型 print('a标签的class属性是:', soup.a.attrs['class']) # 因为是字典,通过字典的方式获取a标签的class属性 print('a标签的href属性是:', soup.a.attrs['href']) # 同样,通过字典的方式获取a标签的href属性
输出结果
a标签类型是:
第一个a标签的属性是: {'href': 'http://www.icourse163.org/course/BIT-268001', 'class': ['py1'], 'id': 'link1'}
a标签属性的类型是:
a标签的class属性是: ['py1']
a标签的href属性是: http://www.icourse163.org/course/BIT-268001
BeautifulSoup的提供了两个超级好用的方法(可能是你用bs方法中最常用的)。借助这两个函数,你可以通过表现的不同属性轻松过滤HTML(XML)文件,查找需要的标签组或单个标签。
find()找到第一个满足条件的标签就返回,不在继续往下寻找。
findAll()找到所有满足条件的标签以列表形返回。
print(soup.find('a'))#找寻a标签第一次出现的位置
结果
Basic Python
常用通过find_all()方法来查找标签元素:<>.find_all(name, attrs, recursive, string, **kwargs) ,返回一个列表类型,存储查找的结果
• name:对标签名称的检索字符串
• attrs:对标签属性值的检索字符串,可标注属性检索
• recursive:是否对子孙全部检索,默认True
• string:<>…>中字符串区域的检索字符串
for i in soup.find_all('a'):
print('标签名称:', i)
结果为
标签名称: Basic Python 标签名称: Advanced Python
for i in soup.find_all('a',{'class':{'py1'}}): #找寻a标签当中class为py1的html标签
print(i)
结果为
标签名称: Basic Python