23 BeautifulSoup 方法选择器find()方的使用

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的其它方法,使用方法是一样的。

在这里插入图片描述

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值