Beautiful Soup之方法选择器

本文详细介绍了BeautifulSoup库中各种选择器的使用方法,包括find_all、find、find_parents等,以及如何通过name、attrs、text等参数进行精确查询。

Beautiful Soup之方法选择器

**

  • find_all()

**
API如下:
find_all(name, atters, recursive, text, **kwargs)

(1) name
根据节点来查询元素

html = '''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>'''

from bs4 import BeautifulSoup
# 创建解析对象
soup = BeautifulSoup(html, 'lxml')
# 查找所有ul节点
print(soup.find_all(name='ul'))
# 查找所有ul节点内部中的li节点
for ul in soup.find_all(name='ul'):
    print(ul.find_all(name='li'))
    # 查找所有li节点中的文本
    for li in ul.find_all(name='li'):
        print(li.string)

在这里插入图片描述

(2) attrs
传入一些属性查询。

html = '''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1" name="elements">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>'''

from bs4 import BeautifulSoup
# 创建解析对象
soup = BeautifulSoup(html, 'lxml')
# 输出id为list-1的节点
print(soup.find_all(attrs={'id': 'list-1'}))
# 输出name为elements的节点
print(soup.find_all(attrs={'name': 'elements'}))

这里查询的时候传入的参数为attrs,参数的类型是字典。比如要查询id为list-1的节点,可以传入
attrs={‘id’: ‘list-1’}的查询条件,得到的结果是列表类型。
然而,对于一些常用的属性,可以不用attrs来传递。可以直接传入id='list-1’这样的查询条件。
但是,查询条件为class时,需要将class=‘element’ 改为 class_=‘element’。因为class是python中的关键字。

(3) text
text参数可以用来匹配节点的文本,传入的形式可以是字符串,可以是正则表达式对象。

html_1 = '''
<div class="panel">
<div class="panel-body">
<a>Hello, This is Chen Jiahe's blog!</a>
<a>Welcome to pay attention to me!</a>
</div>
</div>
'''
bs = BeautifulSoup(html_1, 'lxml')
# compile可以将正则字符串编译成正则表达式对象
print(bs.find_all(text=re.compile('Chen')))

在这里插入图片描述
html_1中有两个a节点,其中都包含文本内容。这里使用find_all方法,传入text参数,该参数为正则表达式对象,再使用re.compile()将正则字符串编译成正则表达式对象。结果为所有匹配正则表达式的节点文本组成的列表。

  • find()

find_all()方法是返回所有匹配的元素组成的列表,而find()方法则是返回第一个匹配的元素。

html = '''
<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1" name="elements">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list-small" id="list-2">
<li class="element">Foo</li>
<li class="element">Bar</li>
</ul>
</div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find(name='ul'))

在这里插入图片描述
上面的html中有两个ul节点,这里使用了find()方法查找ul节点,而find()方法匹配的是第一个元素,因此输出的是第一个ul节点中的内容。返回结果不再是列表,而是单个节点元素。

  • find_parents()和find_parent(): 前者为返回所有的祖先节点,后者为返回直接父节点。
  • find_next_siblings()和find_next_sibling: 前者为返回后面的所有兄弟节点,后者为返回后面的第一个兄弟节点。
  • find_previous_siblings()和find_previous_sibling: 前者为返回前面的所有兄弟节点,后者为返回前面的第一个兄弟节点。
  • find_all_next和find_next(): 前者为返回节点后的所有符合条件的节点,后者为返回节点后第一个符合条件的节点。
  • find_all_previous和find_previous(): 前者为返回节点前的所有符合条件的节点,后者为返回节点前第一个符合条件的节点。
<think>我收到了用户的问题,他想了解BeautifulSoup中CSS选择器的用法。根据系统级指令,我需要参考提供的站内引用,并确保回答结构清晰、真实可靠。用户明确询问"BeautifulSoupCSS选择器使用方法",所以我应该从引用中提取关键信息,组织成逐步的讲解。回顾站内引用:-引用[1]提到BeautifulSoup是一个网页解析库,支持CSS选择器。-引用[2]指出CSS选择器用于高效查找HTML元素。-引用[3]描述了嵌套选择和方法混用。-引用[4]和[5]包含具体代码示例:select()方法的基本使用、属性获取和文本提取。这些引用完整覆盖了CSS选择器的核心用法。我将基于它们构建回答,避免添加外部知识以保持真实性。结构化回答:1.从基础引入:解释什么是CSS选择器,在BeautifulSoup中的作用。2.核心方法:重点讲select()方法,这是使用CSS选择器的入口。3.基本选择器类型:分点介绍类、ID、标签等选择器,用引用[4]的代码示例辅助说明。4.高级用法:嵌套选择,引用[3]提到可以混合其他选择器,展示代码。5.属性与文本提取:基于引用[5]的示例解释如何获取href和文本。确保数学表达式用$...$格式:在回答中可能涉及选择器语法如.class,保持普通文本格式。自然添加引用标识:每部分末尾引用对应来源,如[^4]。生成相关问题:基于主题,考虑可能的扩展如实战技巧或常见错误。最后用中文回答:确保语言流畅易懂。</think> 下面是Beautiful Soup中CSS选择器使用方法的详细说明(基于引用资料): ### 1. CSS选择器核心方法:`select()` 通过`soup.select(css_selector)`查找元素,返回**Tag对象列表**: ```python from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') # 查找所有<ul>下的<li>标签 lis = soup.select('ul li') # [^4] # 查找class为"panel"下的所有class为"panel-heading"的元素 headings = soup.select('.panel .panel-heading') # [^4] ``` ### 2. 基础选择器类型 | 选择器类型 | 语法示例 | 功能说明 | 来源 | |------------------|------------------------|-----------------------------------|--------| | 类选择器 | `.panel-heading` | 选择class属性匹配的元素 | [^4] | | ID选择器 | `#list-2` | 选择id属性匹配的元素 | [^4] | | 标签选择器 | `li` | 选择所有指定标签元素 | [^2] | | 后代选择器 | `.panel .panel-body` | 选择嵌套在父元素内的子元素 | [^4] | ### 3. 嵌套选择与混合使用 ```python # 先选择所有class="item"的元素,再在其中查找<a>标签 tags = soup.select('.item') for tag in tags: a_tags = tag.select('a') # 在结果集上继续使用CSS选择器 [^3] # 混合方法选择器:先通过CSS选择,再用find_all() a_tags = tag.find_all(name='a') # [^5] ``` ### 4. 属性与文本获取 ```python for a in soup.select('a'): # 获取属性值两种方式 href = a['href'] # 直接通过属性名访问 [^5] href = a.attrs['href'] # 通过attrs字典访问 [^5] # 获取文本内容两种方式 text = a.get_text() # 获取所有子孙文本 [^5] text = a.string # 仅当前节点的文本 [^5] ``` ### 5. 选择器组合使用示例 ```python # 获取id="list-2"下class="element"的所有<li> elements = soup.select('#list-2 .element') # [^4] # 获取<li>中带有value1属性的元素 soup.select('li[value1]') # 属性存在选择器 [^5] ``` > **注意要点**: > 1. CSS选择器返回的是**Tag对象列表**,可直接继续解析 > 2. 复杂选择需考虑HTML嵌套层级(如空格表示后代关系) > 3. 属性选择器支持`[attribute=value]`精确匹配[^5]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天意不可违.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值