我们为什么要学习看源码?
pycharm左侧的一些小图标
c Class 类
m Method 方法
f Field 字段
p Property 装饰器
v Variable 变量
from bs4 import BeautifulSoup
# from bs4.element import NavigableString
html_doc = """
The Dormouse's story
The Dormouse's story
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")
print(type(soup.title)) #
# # print(type(soup.a)) #
# # print(type(soup.p)) #
#
print(type(soup.title.string)) #
print(type(soup)) #
html = ''
soup2 = BeautifulSoup(html,'lxml')
print(type(soup2.string)) #
bs里面有三种操作,第一个是遍历,第二个是查找,第三个是修改
from bs4 import BeautifulSoup
# from bs4.element import NavigableString
html_doc = """
The Dormouse1's story
The Dormouse2's story
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")
'''
contents 返回的是一个所有子节点的列表
children 返回的是一个子节点的迭代器
descendants 返回的是一个生成器遍历子子孙孙
面试的问题:迭代器 生成器 可迭代对象它们之间的关系
'''
# head_tag = soup.head
# print(head_tag.contents)
# print(head_tag.children)
# for i in head_tag.children:
# print(i)
# html_tag = soup.html
# for i in html_tag.children:
# print(i)
# for i in html_tag.descendants:
# print(i)
'''
听懂了
string获取标签里面的内容
strings 返回是一个生成器对象用过来获取多个标签内容
stripped_strings 和strings基本一致 但是它可以把多余的空格去掉
'''
# title_tag = soup.title
# print(title_tag.string)
# head_tag = soup.head
# print(head_tag.string)
#
# print(soup.html.strings)
# s = soup.html.strings
# for i in s:
# print(i)
#
# s = soup.html.stripped_strings
# for i in s:
# print(i)
'''
parent直接获得父节点
parents获取所有的父节点
'''
# title_tag = soup.title
# print(title_tag)
# print(title_tag.parent)
# print(soup.html.parent) #整个html文档
# a_tag = soup.a
# # print(a_tag.parents)
#
# for p in a_tag.parents:
# print(p)
# print('-'*50)
'''
next_sibling 下一个兄弟结点
previous_sibling 上一个兄弟结点
next_siblings 下一个包含所有兄弟结点的生成器
previous_siblings上一个包含所有兄弟结点的生成器
'''
# html2 = 'bbbccc ddd '
# soup2 = BeautifulSoup(html2,'lxml')
# # print(soup2.prettify())
# b_tag = soup2.b
# print(b_tag)
# print(b_tag.next_siblings)
# c_tag = soup2.c
# print(c_tag.previous_sibling)
总结:
遍历 标签(一个或多个)【父、兄弟、子】
查找标签
查找文本
查找属性
• 字符串过滤器
• 正则表达式过滤器
我们用正则表达式里面compile方法编译一个正则表达式传给 find 或者 findall这个方法可以实现一个正则表达式的一个过滤器的搜索
• 列表过滤器
• True过滤器
这是在这三者中最为重要的,;要熟练掌握,另外两个只需掌握
from bs4 import BeautifulSoup
html_doc = """
The Dormouse's story
The Dormouse's story
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")
# 需求:找a标签
# a_tag = soup.find('a') # 此时这个a就代表的是字符串过虑器
# print(a_tag)
# a_tas = soup.find_all('a')
# print(a_tas)
# print(soup.find_all(['a','p']))
# print(soup.find_all(['title','b'])) # 此时['title','b'] 列表过滤器
html = """
职位名称
职位类别
人数
地点
发布时间
22989-金融云区块链高级研发工程师(深圳)
技术类
1
深圳
2017-11-25
22989-金融云高级后台开发
技术类
2
深圳
2017-11-25
SNG16-腾讯音乐运营开发工程师(深圳)
技术类
2
深圳
2017-11-25
SNG16-腾讯音乐业务运维工程师(深圳)
技术类
1
深圳
2017-11-25
TEG03-高级研发工程师(深圳)
技术类
1
深圳
2017-11-24
TEG03-高级图像算法研发工程师(深圳)
技术类
1
深圳
2017-11-24
TEG11-高级AI开发工程师(深圳)
技术类
4
深圳
2017-11-24
15851-后台开发工程师
技术类
1
深圳
2017-11-24
15851-后台开发工程师
技术类
1
深圳
2017-11-24
SNG11-高级业务运维工程师(深圳)
技术类
1
深圳
2017-11-24
"""
soup = BeautifulSoup(html,"lxml")
# 1 获取所有的tr标签
# print(soup.tr) print(soup.find('tr')) #效果相同
# trs = soup.find_all('tr')
# for tr in trs:
# print(tr)
# print('*'*80)
# 2 获取第二个tr标签的内容
# tr = soup.find_all('tr')[1]
# print(tr)
# 3 获取所有class等于even的tr标签 注:class被Python团队所使用了 class_ 等价于class
# trs = soup.find_all('tr',class_='even')
# for tr in trs:
# print(tr)
# print('*' * 80)
# trs = soup.find_all('tr',attrs={'class':'even'})
# for tr in trs:
# print(tr)
# print('*' * 80)
# 两种方式效果一致
# 4 获取id等于test class等于test的a标签的数据
# lst = soup.find_all('a',id='test',class_='test')
# for a in lst:
# print(a)
# 5 获取所有a 标签的href属性
# a_lst = soup.find_all('a')
# for a in a_lst:
# href = a.get('href')
# print(href)
# for a in a_lst:
# href = a['href']
# print(href)
# 6 获取所有的职位信息 其他的方式也可以下课自己去试
# trs = soup.find_all('tr')[1:]
# for tr in trs:
# tds = tr.find_all('td')
# job_name = tds[0].string
# print(job_name)
# for tr in trs:
# print(tr.a.string)
find_all源码:
def find_all(self, name=None, attrs={
}, recursive=True, text=None,
limit=None, **kwargs):
name : tag名称
attr : 标签的属性
recursive : 是否递归搜索
text : 文本内容
limli : 限制返回条数
kwargs : 关键字参数