23 BeautifulSoup 方法选择器find()方的使用
文章目录
1. find()方法
【共同点】
find()方法
和find_all()方法
的功能都是在HTML文档中查询需要的信息。
【区别】
find_all()方法
返回值:所有符合条件的元素列表。
find()方法
返回值:返回符合条件的第一个元素。
除了limit参数不能在find()方法
中使用,find()方法
的其他参数和find_all()方法
的参数用法一致。
find()方法
【作用】查找当前节点下,符合条件的第一个元素。
【范围】当前节点下的第一个元素。
2. name 参数
# 声明一个字符串变量存储HTML代码
html_str = """
<html>
<head>
<title>学习网址</title>
</head>
<body>
<p class="story">
这里有3个网址,他们分别是:
<a href="http://example.com/python" class="sister" id="link1"><span>python学习网</span></a>
<a href="http://example.com/java" class="sister" id="link2"><span>java学习网</span></a>
<a href="http://example.com/html" class="sister" id="link3"><span>html学习网</span></a>
</p>
<p>
<li class="element">本是青灯不归客</li>
<li class="element">却因浊酒留风尘</li>
<li class="element">终是庄周梦了蝶</li>
<li class="element">你是恩赐也是劫</li>
</p>
</body>
</html>
"""
# 1. 从bs4解析库导入BeautifulSoup类用于解析数据
from bs4 import BeautifulSoup
# 2.1 BeautifulSoup类(要解析的字符串,解析器)
# 2.2 传入2个参数,实例化类得到一个BeautifulSoup对象
bs_duixiang = BeautifulSoup(html_str, 'lxml')
name参数输出的是一个元素,并不是一个列表。
print("步骤1:find_all获取标签名为li的所有节点,得到的是一个列表:")
print(bs_duixiang.find_all(name="li"),'\n')
print("步骤2:find获取标签名为li的第一个节点,得到的是一个元素:")
print(bs_duixiang.find(name="li"))
【终端输出】
步骤1:find_all获取标签名为li的所有节点,得到的是一个列表:
[<li class="element">本是青灯不归客</li>, <li class="element">却因浊酒留风尘</li>, <li class="element">终是庄周梦了蝶</li>, <li class="element">你是恩赐也是劫</li>]
步骤2:find获取标签名为li的第一个节点,得到的是一个元素:
<li class="element">本是青灯不归客</li>
3. attrs 参数
print("步骤1:find_all获取属性为class,值为sister的所有节点,得到的是一个列表:")
print(bs_duixiang.find_all(attrs={'class':'sister'}),'\n')
print("步骤2:find获取属性为class,值为sister的第一个节点,得到的是一个元素:")
print(bs_duixiang.find(attrs={'class':'sister'}))
【终端输出】
步骤1:find_all获取属性为class,值为sister的所有节点,得到的是一个列表:
[<a class="sister" href="http://example.com/python" id="link1"><span>python学习网</span></a>, <a class="sister" href="http://example.com/java" id="link2"><span>java学习网</span></a>, <a class="sister" href="http://example.com/html" id="link3"><span>html学习网</span></a>]
步骤2:find获取属性为class,值为sister的第一个节点,得到的是一个元素:
<a class="sister" href="http://example.com/python" id="link1"><span>python学习网</span></a>
4. kwargs 参数
print("步骤1:使用赋值形式获取属性为class,值为sister的所有节点,find_all得到的是一个列表:")
print(bs_duixiang.find_all(class_='sister'),'\n')
print("步骤2:使用赋值形式获取属性为class,值为sister的所有节点,find得到的是一个元素:")
print(bs_duixiang.find(class_='sister'))
【终端输出】
步骤1:使用赋值形式获取属性为class,值为sister的所有节点,find_all得到的是一个列表:
[<a class="sister" href="http://example.com/python" id="link1"><span>python学习网</span></a>, <a class="sister" href="http://example.com/java" id="link2"><span>java学习网</span></a>, <a class="sister" href="http://example.com/html" id="link3"><span>html学习网</span></a>]
步骤2:使用赋值形式获取属性为class,值为sister的所有节点,find得到的是一个元素:
<a class="sister" href="http://example.com/python" id="link1"><span>python学习网</span></a>
5. text 参数
# 导入正则表达式所需的re库
import re
# re.compile('.*?学习网')使用re中的compile将正则表达式转换为模型对象
# 将模型对象作为name的参数传入find_all方法
print("步骤1:用正则表达式的.*?方法匹配含有“学习网”字符串的文本,得到的是所有含有“学习网”的文本:")
print(bs_duixiang.find_all(text=re.compile(".*?学习网")),'\n')
print("步骤2:用正则表达式的.*?方法匹配含有“学习网”字符串的文本,得到的是第一个含有“学习网”的文本:")
print(bs_duixiang.find(text=re.compile(".*?学习网")),'\n')
【终端输出】
步骤1:用正则表达式的.*?方法匹配含有“学习网”字符串的文本,得到的是所有含有“学习网”的文本:
['学习网址', 'python学习网', 'java学习网', 'html学习网']
步骤2:用正则表达式的.*?方法匹配含有“学习网”字符串的文本,得到的是第一个含有“学习网”的文本:
学习网址
6. recursive 参数
recursive在find_all中查询没有得到返回的是空列表。
recursive在find中查询没有得到返回的none。
print("步骤1:recursive=False限制获取li标签,find_all中查询没有得到返回的是空列表:")
print(bs_duixiang.find_all('li', recursive=False),'\n')
print("步骤2:recursive=False限制获取li标签,find中查询没有得到返回的none:")
print(bs_duixiang.find('li', recursive=False))
【终端输出】
步骤1:recursive=False限制获取li标签,find_all中查询没有得到返回的是空列表:
[]
步骤1:recursive=False限制获取li标签,find中查询没有得到返回的none:
None
7. 总结
在大多数的情况下,find_all()方法配合find()方法就已经能够满足工作需求。需要查询特殊的范围,可以使用beautifulsoup的其它方法,使用方法是一样的。