Beautiful Soup之方法选择器

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(): 前者为返回节点前的所有符合条件的节点,后者为返回节点前第一个符合条件的节点。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天意不可违.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值