资讯专栏INFORMATION COLUMN

Python 爬虫利器 Beautiful Soup 4 之文档树的搜索

darryrzhong / 1427人阅读

摘要:前面两篇介绍的是的基本对象类型和文档树的遍历本篇介绍的文档搜索搜索文档树主要使用两个方法和是用于搜索节点中所有符合过滤条件的节点那么它支持哪些过滤器呢过滤器的类型字符串正则表达式列表方法字符串查找文档中所有的标签正则表达式找出所有以开头的标

前面两篇介绍的是 Beautiful Soup 4 的基本对象类型和文档树的遍历, 本篇介绍 Beautiful Soup 4 的文档搜索

搜索文档树主要使用两个方法 find() 和 find_all()

find_all():

find_all 是用于搜索节点中所有符合过滤条件的节点

那么它支持哪些过滤器呢?

过滤器的类型:

字符串

正则表达式

列表

True

方法

字符串:

查找文档中所有的标签

soup.find_all("b")

正则表达式:

找出所有以b开头的标签

import re
for tag in soup.find_all(re.compile("^b")):
    print(tag.name)

列表:

找到文档中所有标签和标签

soup.find_all(["a", "b"])

True:

True 可以匹配任何值, 但是不会返回字符串节点

for tag in soup.find_all(True):
    print(tag.name)

方法:

可以定义一个方法, 方法只接受一个元素参数, 如果这个方法返回 True 表示当前元素匹配并且被找到, 如果不是则反回 False

这里是官方文档上面的例子:

下面代码找到所有被文字包含的节点内容

from bs4 import NavigableString
def surrounded_by_strings(tag):
    return (isinstance(tag.next_element, NavigableString)
            and isinstance(tag.previous_element, NavigableString))

for tag in soup.find_all(surrounded_by_strings):
    print tag.name
    
find_all 的方法原型:
find_all( name , attrs , recursive , text , **kwargs )

name 参数:

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

soup.find_all("p") 查找所有的 p 标签

keyword 参数:

soup.find_all(id="link2",class_="title") , 这个将会查找到同时满足这两个属性的标签,这里的class必须用class_传入参数,因为class是python中的关键词

有些属性不能通过以上方法直接搜索,比如html5中的data-*属性,不过可以通过attrs参数指定一个字典参数来搜索包含特殊属性的标签

data_soup.find_all(attrs={"data-foo": "value"})

text 参数:

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

soup.find_all("a", text="Elsie")

limit 参数:

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

soup.find_all("a", limit=2)

recursive 参数:

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

soup.html.find_all("title", recursive=False)
find():
find( name , attrs , recursive , text , **kwargs )

find_all() 方法将返回文档中符合条件的所有 tag, 尽管有时候我们只想得到一个结果, 比如文档中只有一个标签,那么使用 find_all() 方法来查找标签就不太合适, 使用 find_all 方法并设置 limit=1 参数不如直接使用 find() 方法, 下面两行代码是等价的:

soup.find_all("title", limit=1)
soup.find("title")

唯一的区别是 find_all() 方法的返回结果是值包含一个元素的列表, 而 find() 方法直接返回结果

find_all() 方法没有找到目标是返回空列表, find() 方法找不到目标时, 返回 None

CSS选择器:

Beautiful Soup支持大部分的CSS选择器:

soup.select("body a")
soup.select("html head title")
soup.select("p > #link1")
soup.select(".sister")

更多详细用法戳: 官方文档 css 选择器

参考自 Beautiful Soup 4 官方文档.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42569.html

相关文章

  • Python爬虫利器Beautiful Soup的使用(二)

    摘要:本次介绍使用对文档树的遍历。要注意的点在这里没有属性,因为它是同级节点中的第一个。字符串不是兄弟节点因为它们的父节点不同。和通过和的迭代器可以向前或向后访问文档的解析内容。 上一篇文章介绍了 BeautifulSoup 的安装以及基本对象类型。 本次介绍使用 bs4 对 HTML 文档树的遍历。 先把本文用到的例子贴上: str = bs4 test bs4 test ...

    王笑朝 评论0 收藏0
  • Python爬虫利器Beautiful Soup的用法

    摘要:官方解释如下提供一些简单的式的函数用来处理导航搜索修改分析树等功能。废话不多说,我们来试一下吧安装目前已经停止开发,推荐在现在的项目中使用,不过它已经被移植到了,也就是说导入时我们需要。 上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Be...

    cjie 评论0 收藏0
  • BeautifulSoup:网页解析利器上手简介

    摘要:文档写得很清楚,也有中文版,你只要看了最初的一小部分,就可以在代码中派上用场了。 关于爬虫的案例和方法,我们已讲过许多。不过在以往的文章中,大多是关注在 如何把网页上的内容抓取下来 。今天我们来分享下,当你已经把内容爬下来之后, 如何提取出其中你需要的具体信息 。 网页被抓取下来,通常就是 str 字符串类型的对象 ,要从里面寻找信息,最直接的想法就是直接通过字符串的 find 方法 ...

    Carl 评论0 收藏0
  • python爬虫——爬取小说 | 探索白子画和花千骨的爱恨情仇

    摘要:先打开花千骨小说的目录页,是这样的。网页结构分析首先,目录页左上角有几个可以提高你此次爬虫成功后成就感的字眼暂不提供花千骨全集下载。打开盘查看花千骨文件。 知识就像碎布,记得缝一缝,你才能华丽丽地亮相。 1.Beautiful Soup 1.Beautifulsoup 简介 此次实战从网上爬取小说,需要使用到Beautiful Soup。Beautiful Soup为python的...

    newsning 评论0 收藏0
  • Beautiful Soup的用法

    摘要:如果一个仅有一个子节点那么这个也可以使用方法输出结果与当前唯一子节点的结果相同。如果标签里面只有唯一的一个标签了,那么也会返回最里面的内容。 文章来源[Python爬虫利器二之Beautiful Soup的用法 | 静觅](http://cuiqingcai.com/1319.html Beautiful Soup的用法 创建 Beautiful Soup 对象 首先必须要导入 bs4...

    wanghui 评论0 收藏0

发表评论

0条评论

darryrzhong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<