以如下html段落为例进行介绍

<html>
<head>
<title>The Dormouse's story</title>
</head>
<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.
</p>
<p class="story">...</p>
</body>
</html>
soup = BeautifulSoup(html_doc,'lxml')

一、find_all()

s = soup.find_all( 标签名 , id='id' , _class='class' , attrs={ 'attr' : 'value' } ,text='text' , rescursive)  #返回匹配到的元素节点,结果为列表

info1 = s.string、s.text、s.get_text()   #返回匹配到的元素节点的文本值,结果为列表

info2 = s.attrs['attr']   #返回匹配到的元素节点的属性值,结果为列表

语法find_all(name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs),搜索当前标签的子节点,将所有满足条件的结果以列表的形式返回,列表的每一个元素为bs4.element.Tag对象。

  • name:标签名
  • attrs:标签的属性
  • recursive:默认为true会搜索当前标签的所有子孙节点,False则只搜索直接子节点
  • text:标签的文本
  • limit:限制返回的结果的数量,默认返回所有搜索到的结果

1.name指定要搜索的标签名

传入单个的标签,或者多个标签组成的列表

print(soup.find_all('a'))                #返回一个列表,包含3个a标签
print(soup.find_all(['a','b'])) #返回一个列表,包含3个a标签和一个b标签
print(type(soup.html.find_all('a')[0])) #<class 'bs4.element.Tag'>

传入正则表达式

import re
print(soup.find_all(re.compile('b'))) #搜索标签包含b的标签,body标签和b标签都会返回
print(soup.find_all(re.compile('^a'))) #搜索以a开头的标签,返回3个a标签

传入True,表示搜索所有tag标签,

list(map(lambda x:x.name,soup.find_all(True)))
#['html', 'head', 'title', 'body', 'p', 'b', 'p', 'a', 'a', 'a', 'p']

如果没有合适的过滤器,可以定义一个方法传入作为name,该方法只接受一个元素参数,如果方法返回True表示当前元素匹配并且被找到,方法返回False则元素未匹配成功。

例如要搜索有id属性的标签,可以定义一个方法has_id(),并将该方法传入find_all()。

def has_id(tag):
return tag.has_attr('id')
soup.find_all(has_id) #返回3个a标签

2.attrs指定要搜索标签的属性

如果属性名称不是搜索的内置参数,可以直接使用属性名称='属性值'来搜索。需要注意的是由于class是python的关键字所以用class属性搜索时需要使用class_。

print(soup.find_all(id='link1'))
print(soup.find_all(class_='title'))
print(soup.find_all(class_='sister',href=re.compile('elsie')))

有些tag属性在搜索时不能使用,比如HTML5中的data-* 属性,使用k=v形式搜索会报“SyntaxError: keyword can't be an expression”错误,这时需要使用attrs={'属性名称':'属性值'}来搜索。

data = BeautifulSoup('<div data-foo="value">foo!</div>')
print(data.find_all(attrs={'data-foo':'value'}))
# [<div data-foo="value">foo!</div>] print(data.find_all(data-foo='value'))
# SyntaxError: keyword can't be an expression

3.recursive

recursive默认为true,会搜索当前标签的所有子孙节点,如果设置为False则只会搜索直接子节点。

print(soup.html.find_all(re.compile('a')))                  #所有包含a的标签,包括head标签和3个a标签
print(soup.html.find_all(re.compile('a'),recursive=False)) #直接子元素包含a的标签,只有head标签

4.text

搜索标签的文本,返回的也是标签的文本,与name一样可接受字符串、字符串列表、正则表达式和True。

print(soup.find_all(text='Lacie'))  #['Lacie']
print(soup.find_all(text=['Lacie','Tillie'])) #['Lacie', 'Tillie']
print(soup.find_all(text=re.compile('and')))
#['Once upon a time there were three little sisters; and their names were\n ', ' and\n ', ';\n and they lived at the bottom of a well.\n ']

5.limit

如果返回的结果较多,可以使用limit限制返回的结果数量。如果limit设置的值超过了返回的数量会显示所有结果,不会报错。

print(soup.find_all('a',limit=2))   #返回2个a标签
print(soup.find_all('a',limit=10)) #不会报错

二、find()

语法find(name , attrs , recursive , text , **kwargs )

find()与find_all()唯一的区别是,后者返回一个包含所有符合条件的列表,而find()只返回第一个满足条件的。

三、find_parents()与find_parent()

find_parents(name=None, attrs={}, limit=None, **kwargs),当前节点的所有父节点

find_parent(name=None, attrs={}, **kwargs),当前节点的上一级父节点

四、find_next_siblings()与find_next_sibling()

find_next_siblings(name=None, attrs={}, text=None, limit=None, **kwargs),后面节点中所有符合条件的兄弟节点

find_next_sibling(name=None, attrs={}, text=None, **kwargs),后面节点中第一个符合条件兄弟节点

五、find_previous_siblings()与find_previous_sibling()

find_previous_siblings(name=None, attrs={}, text=None, limit=None, **kwargs),前面节点中所有符合条件的兄弟节点

find_previous_sibling(name=None, attrs={}, text=None, **kwargs),前面节点中第一个符合条件的兄弟节点

六、find_all_next()与find_next()

find_all_next(name=None, attrs={}, text=None, limit=None, **kwargs),后面节点中所有符合条件的节点,不分层级

find_next(name=None, attrs={}, text=None, **kwargs),后面节点中第一个符合条件的节点,不分层级

七、find_all_previous()与find_previous()

find_all_previous(name=None, attrs={}, text=None, limit=None, **kwargs),前面节点中所有符合条件的节点,不分层级

find_previous(name=None, attrs={}, text=None, **kwargs),前面节点中第一个符合条件的节点,不分层级

注:以上而、三、四、五、六、七方法参数的用法与find_all()类似。

八、CSS选择器

使用CSS选择器,主要是用到select()与select_one()方法。select()将所有符合条件的结果以列表形式返回,列表的每一个元素为bs4.element.Tag对象。

标签直接通过标签名选取'tagname'、id通过#选取'#id'、类通过.选取'.class'选取,也可三种方式组合进行选择。

select(selector, namespaces=None, limit=None, **kwargs),所有符合条件的

select_one(selector, namespaces=None, **kwargs),第一个符合条件的

1.通过标签名、id、class查找标签

print(soup.select('title'))           #[<title>The Dormouse's story</title>]
print(soup.select('#link1')) #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
print(soup.select('.title')) #[<p class="title" name="dromouse"><b>The Dormouse's story</b></p>]
print(type(soup.select('title')[0])) #<class 'bs4.element.Tag'>

2.标签、id、class的组合查找标签

print(soup.select('p #link1')) #p标签下id为link的子标签
print(soup.select('p a')) #p标签下的所有a子标签
print(soup.select('p > a')) #p标签下的直接a子标签
print(soup.select('p + a')) #p标签后的相邻a兄弟标签
print(soup.select('p ~ a')) #p标签后的所有a兄弟标签,此例中p a 、p > a、p + a、p ~ a结果相同,但表示的意义不同

3.标签、id、class结合属性查找标签,属性在中括号内通过属性名称='属性值'表示

print (soup.select('p[class="title"]'))   #[<p class="title" name="dromouse"><b>The Dormouse's story</b></p>]
print (soup.select('a[id="link1"]')) #[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
print (soup.select('p a[id="link2"]')) #[<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]

4.select()与select_one()获取文本值

print (soup.select('p[class="title"]')[0].string)     #<class 'bs4.element.NavigableString'>对象
print (soup.select('p[class="title"]')[0].get_text() #字符串

python beautifulsoup基本用法-文档搜索的更多相关文章

  1. python beautifulsoup基本用法-文档结构

    一.BeautifulSoup概述 BeautifulSoup是python的一个库,用于接收一个HTML或XML字符串并对其进行格式化,然后使用提供的方法快速查找指定元素. 使用BeautifulS ...

  2. python BeautifulSoup库用法总结

    1. Beautiful Soup 简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.pyt ...

  3. 使用sphinx快速为你python注释生成API文档

    sphinx简介sphinx是一种基于Python的文档工具,它可以令人轻松的撰写出清晰且优美的文档,由Georg Brandl在BSD许可证下开发.新版的Python3文档就是由sphinx生成的, ...

  4. 使用sphinx为python注释生成docAPI文档

    sphinx简介 sphinx是一种基于Python的文档工具,它可以令人轻松的撰写出清晰且优美的文档,由Georg Brandl在BSD许可证下开发. 新版的Python3文档就是由sphinx生成 ...

  5. python快速生成注释文档的方法

    python快速生成注释文档的方法 今天将告诉大家一个简单平时只要注意的小细节,就可以轻松生成注释文档,也可以检查我们写的类方法引用名称是否重复有问题等.一看别人专业的大牛们写的文档多牛多羡慕,不用担 ...

  6. 海量Office文档搜索

    知识管理系统Data Solution研发日记之十 海量Office文档搜索   经过前面两篇文章的介绍,<分享制作精良的知识管理系统 博客备份程序 Site Rebuild>和<分 ...

  7. lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3

    前言: 前面几章已经很详细的讲解了如何创建索引器对索引进行增删查(没有更新操作).如何管理索引目录以及如何使用分词器,上一章讲解了如何生成索引字段和创建索引文档,并把创建的索引文档保存到索引目录,到这 ...

  8. 找到python官方标准库文档

    python中有很多标准库.我们没法记住全部标准库,但是可以在:https://docs.python.org/3/py-modindex.html 中查看标准库的索引 在python的官方文档中,如 ...

  9. python常用模块-配置文档模块(configparser)

    python常用模块-配置文档模块(configparser) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. ConfigParser模块用于生成和修改常见配置文档,当前模块的名称 ...

随机推荐

  1. ajax前后端交互原理(4)

    4.JSON 4.1 什么是JSON? JavaScript 对象表示法(JavaScript Object Notation)简称JSON,是一种轻量级的数据交换格式.虽然它基于JavaScript ...

  2. html+css快速入门教程(3)

    练习: 1.画盒子 2.相框 5 基础选择器 5.1 id选择器 ID选择器与类选择器的定义与引用方式类似,只是定义的符号不一样.ID通常表示唯一值,因此,ID选择器在CSS 中通常只出现一次.如果出 ...

  3. C++的新手入门答疑

    基本部分: .ctrl+f5 调试不运行,会出现press anykey to continue f5 调试 .c++变c,修改Stdafx.h,将#include<stdio.h>替换为 ...

  4. 数据库周刊28│开发者最喜爱的数据库是什么?阿里云脱口秀聊程序员转型;MySQL update误操作;PG流复制踩坑;PG异机归档;MySQL架构选型;Oracle技能表;Oracle文件损坏处理……

    热门资讯 1.Stackoverflow 2020年度报告出炉!开发者最喜爱的数据库是什么?[摘要]2020年2月,近6.5万名开发者参与了 Stackoverflow 的 2020 年度调查,这份报 ...

  5. oracle 环境变量配置 字符集编码配置

    字符编码的环境变量配置: http://jingyan.baidu.com/article/e73e26c0c20f1a24adb6a73e.html (1).数据库服务器字符集select * fr ...

  6. ArcServer服务通过python备份,到另一台机器还原服务

    通过python可以快速把服务器上所有的服务都备份下来(只能备份服务,无法备份缓存文件),然后可以把备份文件考到需要新装的服务器上进行还原.还原时所有的Server缓存.输出等文件夹地址都是按源备份地 ...

  7. 多线程下的list

    前言 list 是 Python 常用的几个基本数据类型之一.正常情况下我们会对 list 有增删改查的操作,显然易见不会有任何问题.那么如果我们试着在多线程下操作list 会有问题吗? 多线程下的 ...

  8. 阿里云Linux CentOS8.1 64位服务器安装LNMP(Linux+Nginx+MySQL+PHP)

    LNMP环境和软件版本: 名称 版本号 查询命令 Linux系统 CentOS Linux release 8.1.1911 (Core) cat /etc/redhat-release Nginx ...

  9. 虚拟机中Linux环境搭建

    Linux系统搭建 作为一名软件测试资深工程师,在日常工作中离不开对测试环境的操作.我们测试的软件,系统都是部署在linux系统环境上,我们掌握Linux系统的日常操作是非常必要的.那么在学习Linu ...

  10. SCOI 2016 萌萌哒

    SCOI 2016 萌萌哒 solution 有点线段树的味道,但是并不是用线段树来做,而是用到另外一个区间修改和查询的利器--ST表 我们可以将一个点拆成\(logN\)个点,分别代表从点\(i\) ...