BeautifulSoup提供了强大的解码HTML查找标签的功能。
参考来源:Beautiful Soup 4.4.0 文档
最常用的是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() 只搜索当前节点的所有子节点,孙子节点.
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.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>节点;
在 select(css)中的 css 有多个节点时,节点元素之间用空格分开,就是查找子孙节点, 节点元素之间用" > "分开(注意>的前后至少包含一个空格),就是查找直接子节点: 用" ~ "连接两个节点表示查找前一个节点后面的所有同级别的兄弟节点(注意~号前后至少有一个空格), 用" + "连接两个节点表示查找前一个节点后面的第一个同级别的兄弟节点(注意+号前后至少有一个空格): Tag,即标签,有很多重要的属性,如:
例如 soup.select(“div p”)是查找所有节点。
例如 soup.select(“div > p”)是查找所有,不包含孙节点。
例如 soup.select(“div ~ p”)查找兄弟节点。
例如 soup.select(“div + p”)查找兄弟节点。
4、Tag对象
name
tag.name
标签名;可以赋值修改
attributes
tag[‘id’]
属性;是一个字典;可以增删改查
text
tag.text
获得标签下包含的所有文本内容