from bs4 import BeautifulSoup
import re
# 要解析的文档内容
html_doc = """
The Dormouse's story
hhhh
Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
soup = BeautifulSoup(html_doc,'lxml')
# 过滤器,find_all 查找所有匹配的标签
# 按照名字匹配 可以传一个名字或一个列表
# print(soup.find_all('a'))
# print(soup.find_all(['a','p']))
# 找id为link1 的a标签
# print(soup.find_all('a',attrs={'id':'link1'}))
# print(soup.find_all('a',attrs={'class':'sister'}))
# print(soup.find_all(name='a',id='link1'))
# 注意如果要按照条件为class来查找,需要使用class_ 因为class是关键字
# 多个类名加空格即可
# 只能找到类名完全匹配的如:
# print(soup.find_all(name='a',class_='sister brother'))
# 只要类名带有sister就能找到
# print(soup.find_all(name='a',class_='sister'))
# 如果属性带有特殊符号 可以把条件装在attrs中
# print(soup.find_all(name='a',attrs={'data-a':'sister'}))
# 指定文本
# print(soup.find_all(name='a',text='Elsie'))
# 过滤器
# 标签名称中带有a字母的标签
# print(soup.find_all(name="a"))
# res = re.compile('b')
# 正则匹配
# print(soup.find_all(name=res))
# 数组
# print(soup.find_all(name=['body','a']))
# True表示所有标签
# print(soup.find_all(True))
# 所有具备id属性的标签
# print(soup.find_all(id=True))
# 方法匹配(写个函数来过滤)
# 必须只能有一个参数,参数表示要过滤的标签
def MyFilter(tag):
return tag.name == "a" and tag.text != "Elsie" and tag.has_attr("id")
print(soup.find_all(MyFilter,limit=1))
# 使用方式和find_all 相同
print(soup.find('a'))
# 总结: 过滤可以是数组,可以是一个 re,可以是一个函数,可以是True