'''
搜索文档树:
是bs4中最强大的功能之一~
soup = BeautifulSoup(解析文本, 解析器)
- soup.find(解析器规则):
根据过滤器查找到解析文本中的"第一个"想要获取的节点。
- soup.find_all(解析器规则):
根据过滤器查找到解析文本中的 "所有" 想要获取的节点。
- soup.find(name, attrs, text) 或 find_all() 内的参数:
- name(标签名): 根据标签的名字查找到想要获取的标签。
- attrs(属性): 根据标签的属性查找到想要获取的标签。
- text(文本): 根据标签的文本查找到想要获取的标签。
注意: 可以根据参数的规律获取想要找的节点标签。
- name,attrs,text中可以使用的过滤器:
- 字符串过滤器
name='字符串', attrs={"字符串": "字符串"}, text="字符串"
- 正则过滤器
import re
name=re.findall(), attrs={"字符串": re.findall()}, text=re.findall()
- 列表过滤器
name=[], attrs={"字符串": []}, text=[]
- bool过滤器
# 获取一个有id并且有文本的p标签
name='p', attrs={"id": True}, text=True
- 方法过滤器
将需要过滤的标签当做参数传入函数中,进行判断,获取想要的节点。
'''
# 解析文本
html_doc = """
The Dormouse's story$37
Once upon a time there were three little sisters; and their names were
Lacie and
and they lived at the bottom of a well.
...
"""
frombs4 importBeautifulSoup
soup = BeautifulSoup(html_doc, 'lxml')
print(soup)
# find()
# 查找html_doc文本中第一个b标签
# print('解析后的结果: ', soup.find(name='b', text='$37'))
# print('解析后的结果: ', soup.find(name='a', attrs={"id": "link2"}))
# find_all()
# 获取所有的a标签
# print(soup.find_all(name='a'))
print('='* 150)
# - 字符串过滤器
# 1) 查找id为link3的a标签
print(soup.find(name='a', attrs={'id': 'link3'}))
print('='* 150)
# 2) 查找class为sister,文本为Elsie的a标签
# Elsie
print(soup.find(name='a', attrs={"class": 'sister'}, text='Elsie'))
print('='* 150)
# 3) 找一个class为story的p标签
print(soup.find(name='p', attrs={'class': 'story'}))
print('='* 150)
# - 正则过滤器
importre
# re.compile('正则表达式') --> 得到一个正则对象,可以配合find方法来使用
# \d+: 匹配有数字的内容
# 1) 查找文本中有数字的标签b标签
print(soup.find(name='b', text=re.compile('\d+')))
print('='* 150)
# 2) 查找所有id中包含数字的标签
print(soup.find_all(attrs={"id": re.compile('\d+')}))
print('='* 150)
# - 列表过滤器
# 1)获取"所有"的a与p标签
print(soup.find_all(name=['a', 'p']))
print('='* 150)
# - bool过滤器
# 1) 获取所有有class属性并且有文本的标签
print(soup.find_all(attrs={'class': True}, text=True))
print('='* 150)
# - 方法过滤器:
# 将需要过滤的标签当做参数传入函数中,进行判断,获取想要的节点。
# 函数:
defhas_id_not_class(tag):
'''
用于接收所有的标签,判断标签内是否只有class
没有id的,并将该标签返回。
:paramtag:
:return:
'''
iftag.has_attr('class') and nottag.has_attr('id'):
returntag
# 1) 搜索只有class 没有id 的标签
# print(soup.find_all(name=函数名))
print(soup.find_all(name=has_id_not_class))