菜鸟笔记
提升您的技术认知

beautiful soup方法选择器-ag真人游戏

阅读 : 85

beautiful soup是python的一个网页解析库,处理快捷; 支持多种解析器,功能强大。教程细致讲解beautiful soup的深入使用、节点选择器、css选择器、beautiful soup4的方法选择器等重要知识点,是学好爬虫的基础课程。

前面所讲的选择方法都是通过标签和属性来选择的,这种方法非常快,但是如果在比较复杂的页面中选择元素,无法精准的定位到元素。

比如:

,
 and
;

在html文档中存在多个findall()find()方法,通过传入参数的方法,来进行精准的定位。

html = '''

hello

  • foo
  • bar
  • ]ay
  • foo
  • bar
''' from bs4 import beautifulsoup soup = beautifulsoup(html, 'lxml')

学习目标

  1. 掌握find_all()方法中的参数的用法

2.1 作用及范围:

  • 作用:用于搜索当前节点的所有符合条件的节点
  • 范围:当前节点下的所有节点,如果没有指定当前节点,则进行全文的搜索

1.2 用法介绍:

find_all(name, attrs, recursive, text, **kwargs)

(1.) name参数

如图所示,name 参数的作用是用来查找所有名字为名字的节点(tag对象)。在使用的时候,可以接收字符串、正则表达式、列表、布尔值。

参数形式:字符串

传入一个字符串参数,即标签名(tag),beautiful soup会查找与字符串内容完全匹配的内容

# 寻找所有span标签
print(soup.find_all('span'))
# 输出结果
[elsie]
参数形式:正则表达式

传入正则表达式,beautiful soup会通过正则表达式的match()函数来匹配内容

# 使用正则匹配以b开头的标签
import re
for tag in soup.find_all(re.compile('^b')):
    print(tag.name)
    
# 输出结果
body
参数形式:列表

传入列表参数,beautiful soup会将与列表中任一元素匹配,并返回结果。

# 使用列表选择包含a和span的所有标签
print(soup.find_all(['a', 'span']))
# 输出结果
[, elsie, , ]
参数形式:布尔值true

true可以匹配任何值

# 使用true选择文件中所有标签
for tag in soup.find_all(true):
    print(tag.name)
    
# 输出结果
html
head
title
body
p
a
span
a
a
p

(2.) attrs参数

  • 作用:查询含有接受的属性值的标签
  • 参数形式:字典类型
    # 获取id为link1的标签
    print(soup.find_all(attrs={
        id: 'link1'}))
    # 输出结果
    []
    

(3.) kwargs参数

  • 作用:接收常用的属性参数,如idclass

  • 参数形式:变量赋值的形式

    # 获取id为link1的标签
    print(soup.find_all(id='link1'))
    # 输出结果
    []
    

    这里直接传入id=‘link1’,就查询到id为’link1’的节点元素了。而对于class来说,它在python中是一个关键字,需要加一个下划线,即class_=‘element’。

    # 获取id为link1的标签
    print(soup.find_all(class_='story'))
    # 输出结果
    [

    once upon a time there were three little sisters; and their names were , and ; and they lived at the bottom of a well.

    ,

    ...

    ]

(4.) text参数

  • 作用:查询含有接收的文本的标签
  • 参数形式:字符串
  • 通过搜索文档中的字符串内容,来确定文件标签。
    # 获取文本中包含elsie内容
    print(soup.find_all(text='elsie'))
    # 输出结果
    ['elsie']
    

    虽然text参数用于搜索字符串,还可以与其他参数混合使用来过滤tag

    # 获取文本中包含elsie内容的标签
    print(soup.find_all('a', text='elsie'))
    # 输出结果
    []
    

(5.) limit参数

  • 作用:用于限制返回结果的数量
  • 参数形式:整数
    # 获取前两个a标签
    print(soup.find_all('a', limit=2))
    # 输出结果
    [, ]
    

(6.) recursive参数

  • 作用:决定是否获取子孙节点
  • 参数形式:布尔值,默认是true
    print(soup.find_all('title'))
    print(soup.find_all('title', recursive=false))
          
    # 输出结果
    [the dormouse's story]
    []
    

find()方法和find_all()方法类似,作用都是在文档中查找需要的信息

区别点在于:

  • find_all()方法返回所有符合条件的元素列表,而find()方法就是返回符合条件的第一个元素
  • 除了limit参数不能在find()方法中使用,find()方法的其他参数和find_all()的参数用法一样

find()方法

  • 作用:查找当前节点下,符合条件的一个元素节点
  • 范围:当前节点下的一个元素

(1.) name参数

# 获取a标签
print(soup.find('a'))
# 输出结果

(2.) attrs参数

# 获取class等于sister的标签
print(soup.find(attrs={
  'class': 'sister'}))
# 输出结果

(3.) kwargs参数

  • 作用:接收常用的属性参数,如idclass
  • 参数形式:变量赋值的形式
# 获取class等于sister的标签
print(soup.find(class_='sister'))
# 输出结果

(4.) text参数

  • 作用:查询含有接收的文本的标签
  • 参数形式:字符串
  • 通过搜索文档中的字符串内容,来确定文件标签。
# 获取文本中包含story的标签
print(soup.find(text=re.compile('.*?story')))
# 输出结果
the dormouse's story

(5.) recursive参数

  • 作用:决定是否获取子孙节点
  • 参数形式:布尔值,默认是true
# 获取文本中包含story的标签
print(soup.find('a', recursive=false)
# 输出结果
none

在beautiful soup中还存在其他的方法,根据自己的业务需求使用就行可以。参数的用法相同,唯一的区别点在于搜索的范围。

find_all()方法的使用

  1. name参数用来接收tag名称,有四种形式:字符串,正则,列表和true
  2. attrs参数用来接收属性的键值对字典
  3. kwargs参数用来接收常用属性的变量赋值的形式 例如:id='link1'class_="sister"
  4. text参数用来接收文本信息
  5. limit参数用来限制返回结果的数量
  6. recursive参数用来决定是否获取子孙节点

查询范围

find()方法:

  • 查找当前节点下,符合条件的第一个节点

find_all()方法:

  • 查找点前节点下,符合条件的所有节点

可供使用的参数

find()方法:

  • nameattrstextkwargsrecursive

find_all()方法:

  • nameattrstextkwargsrecursivelimit

在大多数的情况下,find()方法配合find_all()方法就已经能够满足工作需求,如果遇到特殊情况,需要查询特殊的范围,可以使用beautiful soup的其他方法。

网站地图