BeautifulSoup | Tag | select | 查找标签

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,即标签,有很多重要的属性,如:

nametag.name标签名;可以赋值修改
attributestag[‘id’]属性;是一个字典;可以增删改查
texttag.text获得标签下包含的所有文本内容
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`select()`是BeautifulSoup库中一个非常强大的方法,它可以根据CSS选择器来查找HTML文档中的元素。使用`select()`方法,可以更方便地查找HTML文档中的元素,尤其是对于复杂的HTML文档,使用CSS选择器可以更加灵活地定位元素。 `select()`方法的语法如下: ```python soup.select(css_selector) ``` 其中,`css_selector`是一个字符串,表示CSS选择器,用于指定要查找的元素。 下面是一些常用的CSS选择器: - 标签选择器:`tagname`,例如`div`。 - 类选择器:`.classname`,例如`.content`。 - ID选择器:`#idname`,例如`#header`。 - 属性选择器:`[attribute=value]`,例如`[href="https://www.baidu.com/"]`。 - 后代选择器:`ancestor descendant`,例如`.content p`。 - 子元素选择器:`parent > child`,例如`.content > p`。 - 相邻元素选择器:`element + next_element`,例如`h1 + p`。 - 通用选择器:`*`,表示匹配任何元素。 下面是一个示例,演示如何使用`select()`方法查找HTML文档中的元素: ```python from bs4 import BeautifulSoup html_doc = """ <html> <head> <title>Test</title> </head> <body> <h1>Test</h1> <div class="content"> <p>First paragraph</p> <p>Second paragraph</p> </div> <ul> <li><a href="https://www.baidu.com/">Baidu</a></li> <li><a href="https://www.google.com/">Google</a></li> </ul> </body> </html> """ soup = BeautifulSoup(html_doc, 'html.parser') # 使用标签选择器查找所有的<p>标签 p_tags = soup.select('p') print(p_tags) # 使用类选择器查找所有class属性为"content"的元素 content_elements = soup.select('.content') print(content_elements) # 使用属性选择器查找所有href属性为"https://www.baidu.com/"的<a>标签 baidu_links = soup.select('a[href="https://www.baidu.com/"]') print(baidu_links) ``` 输出结果如下: ``` [<p>First paragraph</p>, <p>Second paragraph</p>] [<div class="content"> <p>First paragraph</p> <p>Second paragraph</p> </div>] [<a href="https://www.baidu.com/">Baidu</a>] ``` 可以看到,`select()`方法非常方便,可以通过简单的CSS选择器来查找HTML文档中的元素。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值