BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单。
官方文档:
1.安装导入
pip install bs4
pip install lxml # 解析模块
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, features='lxml')
2.基本使用
# 找到第一个div标签
soup.find(name='div')
# 找到所有的div标签
soup.find_all(name='div')
# 找到id为importdiv的标签
soup.select('#importdiv')
3.具体使用
###### 1.name 标签名称 ######
html = '<html><body><a>我是一个兵</a></body></html>'
soup = BeautifulSoup(html, 'lxml')
tag = soup.find('a')
print(tag) # <a>我是一个兵</a>
print(tag.name) # a
tag.name = 'div' # 设置标签
print(tag) # <div>我是一个兵</div>
print(tag.name) # div
###### 2.attr 标签属性 ######
html = '<html><body><a href="xxx" class="xxx">我是一个兵</a></body></html>'
soup = BeautifulSoup(html, 'lxml')
tag = soup.find('a')
# 获取属性
print(tag.attrs) # {'href': 'xxx', 'class': ['xxx']}
# 设置属性
tag.attrs = {'href': 'sss'}
print(tag.attrs) # {'href': 'sss'}
###### 3.children 所有子标签 ######
tag = soup.find('div') # 找第一个div标签
tag.children # 找div下的所有子标签
###### 4.descendants 所有子子孙孙标签 ######
tag = soup.find('div') # 找第一个div标签
tag.descendants # 找div下的所有的子子孙孙标签
###### 5.clear 清空子标签 ######
html = '<html><body><a href="xxx" class="xxx">我是一个兵</a></body></html>'
soup = BeautifulSoup(html, 'lxml')
tag = soup.find('body')
tag.clear() # 将body下的所有内容及标签清空
print(tag) # <body></body>
###### 6.decompose 递归删除所有标签 ######
tag = soup.find('body')
tag.decompose()
print(tag) # <None></None>
###### 7.extract 递归删除所有标签,并获取 ######
html = '<html><body><a href="xxx" class="xxx">我是一个兵</a></body></html>'
soup = BeautifulSoup(html, 'lxml')
tag = soup.find('body') # 递归删除所有的标签,并获取删除的标签
delect_tags = tag.extract()
print(tag) # <None></None>
print(delect_tags) # <body><a class="xxx" href="xxx">我是一个兵</a></body>
###### 8.decode和decode_contents ######
# decode(): 转换为字符串(包含当前标签)
# decode_contents(): 转换为字符串(不包含当前标签)
print(tag.decode()) # <body><a class="xxx" href="xxx">我是一个兵</a></body>
print(tag.decode_contents()) # <a class="xxx" href="xxx">我是一个兵</a>
###### 9.encode和encode_contents ######
# encode(): 转换为字节(包含当前标签)
# encode_contents(): 转换为字节(不包含当前标签)
print(tag.encode()) # b'<body><a class="xxx" href="xxx">\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe5\x85\xb5</a></body>'
print(tag.encode_contents()) # b'<a class="xxx" href="xxx">\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\x80\xe4\xb8\xaa\xe5\x85\xb5</a>'
###### 10.find 获取匹配的第一个标签 ######
html = '<html><body><a class="xxx">我是一个兵</a></body></html>'
soup = BeautifulSoup(html, 'lxml')
tag = soup.find(name='a', attrs={'class', 'xxx'}, text='我是一个兵', recursive=True)
###### 11.find_all 获取匹配的所有标签 ######
# 普通查找
soup.find_all('a')
# 限制查找条数
soup.find_all('a', limit=1)
# 使用列表来查找
soup.find_all(name=['a', 'img']) # 查找标签名为a和img的,[<a class="xxx">我是一个兵</a>, <img/>, <a></a>]
soup.find_all(attrs={'class': ['xxx', 'yyy']}) # 查找属性为xxx和yyy的,[<a class="xxx">我是一个兵</a>, <img class="yyy"/>]
# 也可适用于text,id,href等等
# 使用正则来查找
pattern = re.compile('^x') # 匹配以x开头class的标签
tag = soup.find_all(attrs={'class': pattern})
# 正则可以用于name;id;href等等
# 方法筛选
def foo(tag):
return tag.has_attr('class') and tag.has_attr('id')
soup.find_all(name=foo)
# get方法获取属性标签
tag = soup.find('a')
print(tag.get('class')) # ['xxx']
###### 12.has_attr 检查标签是否具有该属性 ######
tag = soup.find('a')
print(tag.has_attr('id')) # False
###### 13.get_text 获取标签文本内容 ######
tag = soup.find('a')
print(tag.get_text()) # 我是一个兵
###### 14.index 获取标签在某标签中的索引位置 ######
tag = soup.find('body')
print(tag.index(tag.find('a'))) # 0
tag = soup.find('body')
for k, v in enumerate(tag):
print(k, v) # k为索引;v为标签和内容
###### 15.is_empty_element 是否是空标签或者自闭合标签 ######
tag = soup.find('img')
print(tag.is_empty_element) # True
###### 16.当前标签的关联标签 ######
soup.next
soup.next_element
soup.next_elements
soup.next_sibling
soup.next_siblings
tag.previous
tag.previous_element
tag.previous_elements
tag.previous_sibling
tag.previous_siblings
tag.parent
tag.parents
###### 17.查找某标签的关联标签 ######
tag.find_next(...)
tag.find_all_next(...)
tag.find_next_sibling(...)
tag.find_next_siblings(...)
tag.find_previous(...)
tag.find_all_previous(...)
tag.find_previous_sibling(...)
tag.find_previous_siblings(...)
tag.find_parent(...)
tag.find_parents(...)
# 参数同find_all
###### 18.select, select_one, CSS选择器 ######
tag = soup.select('div > a.xxx') # 选择div下的class为xxx的a标签
tag = soup.select('div, a') # 选择div或a标签
soup.select('a[href*=".com/el"]') # 正则匹配
from bs4.element import Tag
def default_candidate_generator(tag):
for child in tag.descendants:
if not isinstance(child, Tag):
continue
if not child.has_attr('href'):
continue
yield child
tags = soup.find('body').select("a", _candidate_generator=default_candidate_generator, limit=1)
print(type(tags), tags)
###### 19.更改标签的内容 ######
html = '<html><body><a class="xxx">我是一个兵</a></body></html>'
soup = BeautifulSoup(html, 'lxml')
tag = soup.find('a')
print(tag.string) # 获取文本内容:我是一个兵
tag.string = '我不是一个兵' # 设置值
print(soup) # <html><body><a class="xxx">我不是一个兵</a></body></html>
tag = soup.find('body')
# 递归内部获取所有标签的文本
print(tag.stripped_strings ) # <generator object stripped_strings at 0x0137FC60>
###### 20.append 在当前标签内部追加一个标签 ######
tag = soup.find('a')
tag.append(soup.find('img'))
print(soup) # <html><body><a class="xxx">我是一个兵<img/></a></body></html>
tag = soup.find('a')
from bs4.element import Tag
obj = Tag(name='span', attrs={'id': 'id_1'})
obj.string = 'span标签'
tag.append(obj)
print(soup) # <html><body><a class="xxx">我是一个兵<span id="id_1">span标签</span></a></body></html>
###### 21.insert 在当前标签内部指定位置插入一个标签 ######
obj = soup.find('img')
tag = soup.find('a')
tag.insert(0, obj) # 插入最前边
print(soup) # <html><body><a class="xxx"><img/>我是一个兵</a></body></html>
###### 22.insert_after, insert_before 在当前标签前面或后面插入 ######
obj = soup.find('img')
tag = soup.find('a')
tag.insert_after(obj)
tag.insert_before(obj)
###### 23.replace_with 当前标签替换为指定标签 ######
obj = soup.find('img')
tag = soup.find('a')
tag.replace_with(obj)
###### 24.setup 创建标签之间的关系 ######
obj = soup.find('img')
tag = soup.find('a')
tag.setup(next=a)
print(tag.next)
###### 25.wrap 用指定标签把当前标签包裹起来 ######
obj = soup.find('img')
tag = soup.find('a')
tag.wrap(obj)
tag = soup.find('a')
tag.wrap(soup.find('img'))
###### 26.unwrap 去掉当前标签,将保留其包裹的标签 ######
tag = soup.find('a')
tag.unwrap()