Beautifulsoup之findAll()和find()

两个函数非常相似:
findAll(tag, attributes, recursive, text, limit, keywords)
find(tag, attributes, recursive, text, keywords)

TAG

在beautifulsoup里,可以同时查找多个标签,将标签名字放入一个list即可:

nameList=bsObj.findAll(["h1","h2"])#bsObj是beautifulsoup获得的html script。

ATTRIBUTES

标签的参数用字典封装起来:{“class”:“green”}。
同样标签也可以同时查找多个:{“class”:{“green”,“red”}}

RECURSIVE

嗯,这个要打的字好多啊,我直接引用穿山甲那本书喽

递归参数recursive 是一个布尔变量。你想抓取HTML 文档标签结构里多少层的信息?如果
recursive 设置为True,findAll 就会根据你的要求去查找标签参数的所有子标签,以及子
标签的子标签。如果recursive 设置为False,findAll 就只查找文档的一级标签。findAll
默认是支持递归查找的(recursive 默认值是True);一般情况下这个参数不需要设置,除
非你真正了解自己需要哪些信息,而且抓取速度非常重要,那时你可以设置递归参数。

TEXT

tag是用标签来匹配所查找的文本,而text则是用标签所含的文本内容进行匹配:

nameList = bsObj.findAll(text="the prince")

LIMIT

find()和findAll()的区别在于此,find()相当于findAll()的limit是1. limit决定从所有结果中选出几个。比如:limit=7,则选择所有结果的前7个。

KEYWORD

用于选择有指定属性的标签。

关键词参数的注意事项
虽然关键词参数keyword 在一些场景中很有用,但是,它是BeautifulSoup 在
技术上做的一个冗余功能。任何用关键词参数能够完成的任务,同样可以用
本章后面将介绍的技术解决(请参见2.3 节和2.6 节)。
例如,下面两行代码是完全一样的:
bsObj.findAll(id=“text”)
bsObj.findAll("", {“id”:“text”})
另外,用keyword 偶尔会出现问题,尤其是在用class 属性查找标签的时候,
因为class 是Python 中受保护的关键字。也就是说,class 是Python 语言
的保留字,在Python 程序里是不能当作变量或参数名使用的(和前面介绍
的BeautifulSoup.findAll() 里的keyword 无关)2。假如你运行下面的代码,
Python 就会因为你误用class 保留字而产生一个语法错误:
bsObj.findAll(class=“green”)
不过,你可以用BeautifulSoup 提供的有点儿臃肿的方案,在class 后面增加一个下划线:
bsObj.findAll(class_=“green”)
另外,你也可以用属性参数把class 用引号包起来:
bsObj.findAll("", {“class”:“green”})
看到这里,你可能会扪心自问:“现在我是不是已经知道如何用标签属性获取一组标签了——用字典把属性传到函数里就行了?”
回忆一下前面的内容,通过标签参数tag 把标签列表传到.findAll() 里获取一列标签,其实就是一个“或”关系的过滤器(即选择所有带标签1 或标签2 或标签3……的一列标签)。如果你的标签列表很长,就需要花很长时间才能写完。而关键词数keyword 可以让你增加一个“与”关系的过滤器来简化工作。

### BeautifulSoup 中 `find` `find_all` 的用法及区别 #### 一、功能概述 `find` `find_all` 是 Python 的 BeautifulSoup 库中最常用的两个方法,用于解析 HTML 或 XML 文档并提取所需的数据。两者的功能相似,但在返回的结果数量上有显著差异。 - **`find()` 方法** 它仅返回第一个匹配的标签对象。如果未找到任何匹配项,则返回 `None`[^1]。 - **`find_all()` 方法** 它会返回文档中所有符合条件的标签列表。如果没有找到任何匹配项,则返回一个空列表[][^2]。 #### 二、语法结构 以下是两种方法的基本语法: - **`find(name, attrs, recursive, string, **kwargs)`** - **`find_all(name, attrs, recursive, string, limit, **kwargs)`** 两者的主要参数解释如下: - **name**: 要查找的标签名称。 - **attrs**: 字典形式表示要查找的标签属性及其值。 - **recursive**: 是否递归子节点,默认为 True。 - **string**: 查找特定字符串内容的标签。 - **limit (仅适用于 find_all)**: 控制返回的最大条目数[^3]。 #### 三、具体示例对比 ##### 使用 `find()` ```python from bs4 import BeautifulSoup html_doc = ''' <div class="title">Example</div> <div class="positionInfo">Position Info 1</div> <div class="positionInfo">Position Info 2</div> ''' soup = BeautifulSoup(html_doc, 'html.parser') result_find = soup.find('div', {'class': 'positionInfo'}) print(result_find) ``` 运行结果只会显示第一个 `<div>` 标签的内容: ``` <div class="positionInfo">Position Info 1</div> ``` ##### 使用 `find_all()` ```python result_find_all = soup.find_all('div', {'class': 'positionInfo'}, limit=2) for item in result_find_all: print(item) ``` 运行结果将会打印前两条记录: ``` <div class="positionInfo">Position Info 1</div> <div class="positionInfo">Position Info 2</div> ``` 注意,在上面的例子中,通过设置 `limit=2` 参数来控制返回的数量[^1]。 #### 四、灵活性扩展 除了基本的功能外,`find_all()` 还可以接受更复杂的查询条件,比如正则表达式或者自定义函数作为筛选依据[^4]。 例如利用正则表达式进行模糊匹配: ```python import re pattern = re.compile(r'^pos.*') # 匹配以'pos'开头的类名 results_regex = soup.find_all(class_=pattern) for res in results_regex: print(res) ``` 以上代码能够查找出所有具有类似 `'positionInfo'` 类名的标签。 --- #### 总结 综上所述,虽然 `find()` 可视为 `find_all(limit=1)` 的特例,但它更适合快速定位单个目标;而当需要批量处理多个相同特征的对象时,推荐优先考虑使用 `find_all()` 函数[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值