热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

BS4(BeautifulSoup4)的使用find_all()篇

可以直接参考BS4文档:https:www.crummy.comsoftwareBeautifulSoupbs4docindex.zh.html#find-al

可以直接参考 BS4文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#find-all

 

注意的是

1.有些tag属性在搜索不能使用,比如HTML5中的 data-* 属性:

data_soup = BeautifulSoup(\'
foo!
\') data_soup.find_all(data-foo="value") # SyntaxError: keyword can\'t be an expression

但是可以通过 find_all() 方法的 attrs 参数定义一个字典参数来搜索包含特殊属性的tag:

data_soup.find_all(attrs={"data-foo": "value"})
# [
foo!
]
表达式可以是字符串、布尔值、正则表达式

2.class属性要用class_=""

 

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

find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件.这里有几个例子:

soup.find_all("title")
# []

soup.find_all("p", "title")
# [

The Dormouse\'s story

] soup.find_all("a") # [Elsie, # Lacie, # Tillie] soup.find_all(id="link2") # [Lacie] import re soup.find(text=re.compile("sisters")) # u\'Once upon a time there were three little sisters; and their names were\n\'

有几个方法很相似,还有几个方法是新的,参数中的 text 和 id 是什么含义? 为什么 find_all("p", "title") 返回的是CSS Class为”title”的

标签? 我们来仔细看一下 find_all() 的参数

name 参数

name 参数可以查找所有名字为 name 的tag,字符串对象会被自动忽略掉.

简单的用法如下:

soup.find_all("title")
# []

重申: 搜索 name 参数的值可以使任一类型的 过滤器 ,字符窜,正则表达式,列表,方法或是 True .

keyword 参数

如果一个指定名字的参数不是搜索内置的参数名,搜索时会把该参数当作指定名字tag的属性来搜索,如果包含一个名字为 id 的参数,Beautiful Soup会搜索每个tag的”id”属性.

soup.find_all(id=\'link2\')
# [Lacie]

如果传入 href 参数,Beautiful Soup会搜索每个tag的”href”属性:

soup.find_all(href=re.compile("elsie"))
# [Elsie]

搜索指定名字的属性时可以使用的参数值包括 字符串 , 正则表达式 , 列表, True .

下面的例子在文档树中查找所有包含 id 属性的tag,无论 id 的值是什么:

soup.find_all(id=True)
# [Elsie,
#  Lacie,
#  Tillie]

使用多个指定名字的参数可以同时过滤tag的多个属性:

soup.find_all(href=re.compile("elsie"), id=\'link1\')
# [three]

有些tag属性在搜索不能使用,比如HTML5中的 data-* 属性:

data_soup = BeautifulSoup(\'
foo!
\') data_soup.find_all(data-foo="value") # SyntaxError: keyword can\'t be an expression

但是可以通过 find_all() 方法的 attrs 参数定义一个字典参数来搜索包含特殊属性的tag:

data_soup.find_all(attrs={"data-foo": "value"})
# [
foo!
]

按CSS搜索

按照CSS类名搜索tag的功能非常实用,但标识CSS类名的关键字 class 在Python中是保留字,使用 class 做参数会导致语法错误.从Beautiful Soup的4.1.1版本开始,可以通过 class_ 参数搜索有指定CSS类名的tag:

soup.find_all("a", class_="sister")
# [Elsie,
#  Lacie,
#  Tillie]

class_ 参数同样接受不同类型的 过滤器 ,字符串,正则表达式,方法或 True :

soup.find_all(class_=re.compile("itl"))
# [

The Dormouse\'s story

] def has_six_characters(css_class): return css_class is not None and len(css_class) == 6 soup.find_all(class_=has_six_characters) # [Elsie, # Lacie, # Tillie]

tag的 class 属性是 多值属性 .按照CSS类名搜索tag时,可以分别搜索tag中的每个CSS类名:

css_soup = BeautifulSoup(\'

\') css_soup.find_all("p", class_="strikeout") # [

] css_soup.find_all("p", class_="body") # [

]

搜索 class 属性时也可以通过CSS值完全匹配:

css_soup.find_all("p", class_="body strikeout")
# [

]

完全匹配 class 的值时,如果CSS类名的顺序与实际不符,将搜索不到结果:

soup.find_all("a", attrs={"class": "sister"})
# [Elsie,
#  Lacie,
#  Tillie]

text 参数

通过 text 参数可以搜搜文档中的字符串内容.与 name 参数的可选值一样, text 参数接受 字符串 , 正则表达式 , 列表, True . 看例子:

soup.find_all(text="Elsie")
# [u\'Elsie\']

soup.find_all(text=["Tillie", "Elsie", "Lacie"])
# [u\'Elsie\', u\'Lacie\', u\'Tillie\']

soup.find_all(text=re.compile("Dormouse"))
[u"The Dormouse\'s story", u"The Dormouse\'s story"]

def is_the_only_string_within_a_tag(s):
    ""Return True if this string is the only child of its parent tag.""
    return (s == s.parent.string)

soup.find_all(text=is_the_only_string_within_a_tag)
# [u"The Dormouse\'s story", u"The Dormouse\'s story", u\'Elsie\', u\'Lacie\', u\'Tillie\', u\'...\']

虽然 text 参数用于搜索字符串,还可以与其它参数混合使用来过滤tag.Beautiful Soup会找到 .string 方法与 text 参数值相符的tag.下面代码用来搜索内容里面包含“Elsie”的标签:

limit 参数

find_all() 方法返回全部的搜索结构,如果文档树很大那么搜索会很慢.如果我们不需要全部结果,可以使用 limit 参数限制返回结果的数量.效果与SQL中的limit关键字类似,当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果.

文档树中有3个tag符合搜索条件,但结果只返回了2个,因为我们限制了返回数量:

soup.find_all("a", limit=2)
# [Elsie,
#  Lacie]

recursive 参数

调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False .

一段简单的文档:

 
  
 
...

是否使用 recursive 参数的搜索结果:

soup.html.find_all("title")
# []

soup.html.find_all("title", recursive=False)
# []

像调用 find_all() 一样调用tag

find_all() 几乎是Beautiful Soup中最常用的搜索方法,所以我们定义了它的简写方法. BeautifulSoup 对象和 tag 对象可以被当作一个方法来使用,这个方法的执行结果与调用这个对象的 find_all() 方法相同,下面两行代码是等价的:

soup.find_all("a")
soup("a")

这两行代码也是等价的:

soup.title.find_all(text=True)
soup.title(text=True)

推荐阅读
  • WhatisthisPRfor?AddingMapVisualizationforZeppelinusingLeaflet[1]. ... [详细]
  • 更多_想说爱你不容易 | 使用最小 WEB API 实现文件上传(Swagger 支持)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了想说爱你不容易|使用最小WEBAPI实现文件上传(Swagger支持)相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Python中如何去掉括号内的文字?原文:https://ww ... [详细]
  • 开发笔记:locust性能测试4参数关联
    本文由编程笔记#小编为大家整理,主要介绍了locust性能测试4-参数关联相关的知识,希望对你有一定的参考价值。前言前面【Locust ... [详细]
  • sqlserver int转varchar_SQL Server 脚本操作 — 创建表
    创建表在前面我们已经学了如何用脚本创建数据库这一篇我们将学习如何创建表若要创建表,您必须提供该表的名称以及该表中每个列的名称和数据类型。指出每个列中是否允许空值&#x ... [详细]
  • 分享一份大佬的MySQL数据库设计规范,值得收藏
    MySQL数据库与Oracle、SQLServer等数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。无意中从github上看到一个大 ... [详细]
  • sedi 单引号中嵌套双引号_面试中的shell部分看着就对了
    “进入企业后,大部分情况都是Linux操作系统,那么熟悉命令的用法以外,熟悉使用shell脚本也是让我们有更多时间摸鱼的好办法(ps面试要 ... [详细]
  • restful是这些年的高频词汇了,各大互联网公司也都纷纷推出了自己的restfulapi,其实restful和thrift,grpc类似,就是一种协议,但是这种协议有点特殊的就是 ... [详细]
  • 对象与对象之间的成员变量是相互独立的.要想共用数据,则需要使用静态成员或静态方法#只要在类中声明静态成员变量,即使不定义对象,也可以为静态成员变量分配空间,进而可以使用静态成员变 ... [详细]
  • HTML文档是互联网上的主要文档类型,但还存在如TXT、WORD、Excel、PDF、csv等多种类型的文档。网络爬虫不仅需要能够抓取HTML中的敏感信息,也需要有抓取其他类型文档的能 ... [详细]
  • 网站秒开算什么,Google
    作为一家活在Web世界的公司,Google对提升网页性能一直是不遗余力。今天,为了让用户能够更快地浏览网页,Google联合8家科技公司以及近30家新闻机构一起发布了一个名为移动页 ... [详细]
  • 计算机程序的思维逻辑 (第7节更新)再谈乱码恢复
    在第6节和第7节,我们讨论了文本的二进制编码、乱码、以及恢复,第6节受到了很多读者的一致好评,但第7节有读者反馈解说的不太透彻,希望再详细一点,本文就 ... [详细]
  • 历时一年,终于开发的差不多了,将它命名为:Perfection,现在先来为此系统做一部介绍吧,稍后再提供演示地址。魔盒PerfectionCMS产品是魔盒网络 ... [详细]
  • db文件如果用记事本或者Notepad++打开,会显示乱码,改变编码不能解决问题,如果用UltraEdit打开,可以看到进制数据,但是无意义的。正确的方法有两种:(1)用sqlit ... [详细]
  • php preg_replace 正则替换图片路径
    2019独角兽企业重金招聘Python工程师标准$str ... [详细]
author-avatar
钟孝健V
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有