温故 | BeautifulSoup | Tag | 查找功能

BeautifulSoup提供了强大的解码HTML查找标签的功能。

参考来源:Beautiful Soup 4.4.0 文档

1、find_all 与 find

最常用的是find_all函数,详细如下:
find_all(self,name=None,attrs={},recursive=True,text=None,limit=None,kwargs)
解释:
self:类方法的标志;
name:要查找的tag的名称,默认为None;
attrs:标签属性,是一个字典,默认为空
recursive:指定查找是否在元素节点的子树下面全范围进行,默认是 True;为False表示只在当前节点的直接子节点搜索;
text:通过 text 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受字符串 , 正则表达式 , 列表, True .
limit:限制返回结果的数量,达到限制后停止搜索;
**kwargs 一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索。

解释一下**kwargs与attrs的区别,关键在于属性是不是要查找的标签的特有属性,如果是,用attrs,不是就用kwargs。

返回查找到的所有指定的元素的列表,每个元素是一个 bs4.element.Tag 对象。
如果没有结果返回空列表。
————————————————————————————————————————————

还有一个小知识:

因为find_all是SP最常用的方法,所以SP库定义了一个简写方法. BeautifulSoup 对象和 tag 对象可以被当作一个方法来使用,这个方法的执行结果与调用这个对象的 find_all() 方法相同,下面两行代码是等价的:

soup.find_all("a")
soup("a")

find函数有和find_all完全一致的参数,区别是find函数只返回第一个满足搜索条件的节点,等价于:

soup.find_all('head',limit=1)
soup('head',limit=1)
soup.find('head')

find找不到结果时返回None。

find_all() 和 find() 只搜索当前节点的所有子节点,孙子节点.

2、其他查找方法

SP的所有搜索用方法有着完全相同于find_all的参数。

find_parents() :搜索当前节点的父辈节点,返回所有满足条件结果组成的列表;
find_parent() :用来搜索当前节点的父辈节点,返回第一个满足条件的结果
find_next_siblings() :返回所有符合条件的后面的兄弟节点, 组成列表
find_next_sibling() :只返回符合条件的后面的第一个tag节点.
find_previous_siblings() :返回所有符合条件的前面的兄弟节点, 组成列表
find_previous_sibling() :返回第一个符合条件的前面的兄弟节点
———————————————————————————————————————————
find_all_next() :返回所有符合条件的节点, 列表结果
find_next(): 返回第一个符合条件的节点

值得一提的是,这个方法和find_all的区别是,find_all只遍历当前节点下的节点,而find_next_all是遍历整个文档。

————————————————————————————————————————————
find_all_previous(): 返回所有符合条件的节点,列表。
find_previous(): 返回第一个符合条件的节点.

举例说明,对一个tag对象a,a.find_all_previous('b')表示查找所有出现在<a>标签之前的<b>标签。

3、CSS选择器

3.1 详解

tag.select(css)
其中 tag 是一个 bs4.element.Tag 对象,即 HTML 中的一个 element 节点元素,select 是它的查找方法,css 是类似 css 语法的一个字符串,一般结构如下:[tagName][attName[=value]]

tagName 是元素名称,如果没有指定就是所有元素;
attName=value 是属性名称,value 是它对应的值,可以不指定属性,在指定了属性后也可以不指定值;
tag.select(css)返回一个 bs4.element.Tag列表,哪怕只有一个元素也是一个列表;

举例如:

tags=soup.select("p a")
tags=soup.select("a")
tags=soup.select("p[class] a")
soup.select("a[href='http://example.com/elsie']")

————————————————————————————————————————————
[attName=value]表示属性与属性值相等,但其实也可以指定不等、包含…

选择器 描述
[attName] 选择带有指定属性的元素
[attName=value] 选择带有指定属性与属性值的元素
[attName^=value] 匹配属性值以指定值开头的元素
[attName$=value] 匹配属性值以指定值结尾的元素
[attName*=value] 匹配属性值中包含指定值的元素

举例如:

soup.select("a[href='http://example.com']") 查找 href="http://example.com"<a>节点;
soup.select("a[href$='sie']") 查找 href 以"sie"结尾的<a>节点;
soup.select("a[href^='http://example.com']") 查找 href以"http://example.com"开始的<a>节点;
soupselect("a[href*='example']") 查找 href 的值中包含"example"字符串的<a>节点;

3.2 查找子孙节点

在 select(css)中的 css 有多个节点时,节点元素之间用空格分开,就是查找子孙节点,
例如 soup.select(“div p”)是查找所有<div>节点下面的所有子孙<p>节点。

节点元素之间用" > "分开(注意>的前后至少包含一个空格),就是查找直接子节点:
例如 soup.select(“div > p”)是查找所有<div>节点下面的所有直接子节点<p>不包含孙节点

用" ~ "连接两个节点表示查找前一个节点后面的所有同级别的兄弟节点(注意~号前后至少有一个空格),
例如 soup.select(“div ~ p”)查找<div>后面所有同级别的<p>兄弟节点

用" + "连接两个节点表示查找前一个节点后面的第一个同级别的兄弟节点(注意+号前后至少有一个空格):
例如 soup.select(“div + p”)查找<div>后面的第一个同级别的<p>兄弟节点。

4、Tag对象

Tag,即标签,有很多重要的属性,如:

name tag.name 标签名;可以赋值修改
attributes tag[‘id’] 属性;是一个字典;可以增删改查
text tag.text 获得标签下包含的所有文本内容
发布了70 篇原创文章 · 获赞 15 · 访问量 4289

猜你喜欢

转载自blog.csdn.net/Heart_for_Ling/article/details/103650649
tag