BeautifulSoup4是爬虫必学的技能。BeautifulSoup最主要的功能是从网页抓取数据,Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,如果我们不安装它,则 Python 会使用 Python默认的解析器,lxml 解析器更加强大,速度更快,推荐使用lxml 解析器。

一、简介

灵活又方便的网页解析库,处理高效,支持多种解析器。

利用它不用编写正则表达式即可方便地实现网页信息的提取。

安装:pip3 install BeautifulSoup4

解析器使用方法优势劣势

Python标准库BeautifulSoup(markup, “html.parser”)Python的内置标准库、执行速度适中 、文档容错能力强Python 2.7.3 or 3.2.2)前的版本中文容错能力差

lxml HTML 解析器BeautifulSoup(markup, “lxml”)速度快、文档容错能力强需要安装C语言库

lxml XML 解析器BeautifulSoup(markup, “xml”)速度快、唯一支持XML的解析器需要安装C语言库

html5libBeautifulSoup(markup, “html5lib”)最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档速度慢、不依赖外部扩展

二、基本用法

#基本用法from bs4 import BeautifulSoupbs = BeautifulSoup(html,"html.parser") # 缩进格式print(bs.prettify())print(bs.prettify()) # 格式化html结构print(bs.title) # 获取title标签的名称print(bs.title.name) # 获取title的nameprint(bs.title.string) # 获取head标签的所有内容print(bs.head) print(bs.div) # 获取第一个div标签中的所有内容print(bs.div["id"]) # 获取第一个div标签的id的值print(bs.a) print(bs.find_all("a")) # 获取所有的a标签print(bs.find(id="u1")) # 获取id="u1"for item in bs.find_all("a"): print(item.get("href")) # 获取所有的a标签,并遍历打印a标签中的href的值for item in bs.find_all("a"): print(item.get_text())#选择元素from bs4 import BeautifulSoupsoup = BeautifulSoup(html, "lxml")print(soup.title)print(type(soup.title))print(soup.head)print(soup.p)#获取名称print(soup.title.name)print(soup.p.attrs["name"])print(soup.p["name"])#获取内容print(soup.p.string)#获取子孙节点print(soup.p.children)for i, child in enumerate(soup.p.children): print(i, child)

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

可根据标签名、属性、内容查找文档,返回所有符合条件的内容

#通过标签from bs4 import BeautifulSoupsoup = BeautifulSoup(html, "lxml")print(soup.find_all("ul"))print(type(soup.find_all("ul")[0]))#通过属性print(soup.find_all(attrs={"id": "list-1"}))print(soup.find_all(attrs={"name": "elements"}))print(soup.find_all(id="list-1"))print(soup.find_all(class_="element"))#通过textprint(soup.find_all(text="Foo"))

4.find( name , attrs , recursive , text , **kwargs )

find返回单个元素,find_all返回所有元素

from bs4 import BeautifulSoupsoup = BeautifulSoup(html, "lxml")print(soup.find("ul"))print(type(soup.find("ul")))print(soup.find("page"))

find_parents() find_parent()

find_parents()返回所有祖先节点,find_parent()返回直接父节点。

find_next_siblings() find_next_sibling()

find_next_siblings()返回后面所有兄弟节点,find_next_sibling()返回后面第一个兄弟节点。

find_previous_siblings() find_previous_sibling()

find_previous_siblings()返回前面所有兄弟节点,find_previous_sibling()返回前面第一个兄弟节点。

find_all_next() find_next()

find_all_next()返回节点后所有符合条件的节点, find_next()返回第一个符合条件的节点

find_all_previous() 和 find_previous()

find_all_previous()返回节点后所有符合条件的节点, find_previous()返回第一个符合条件的节点

5.css选择

通过select()直接传入CSS选择器即可完成选择

from bs4 import BeautifulSoupsoup = BeautifulSoup(html, "lxml")print(soup.select(".panel .panel-heading"))print(soup.select("ul li"))print(soup.select("#list-2 .element"))print(type(soup.select("ul")[0]))for ul in soup.select("ul"): print(ul.select("li"))#获得属性for ul in soup.select("ul"): print(ul["id"]) print(ul.attrs["id"])#获取内容for li in soup.select("li"): print(li.get_text())三、BeautifulSoup4四大对象种类

BeautifulSoup4将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:

1.Tag

我们可以利用 soup 加标签名轻松地获取这些标签的内容,这些对象的类型是bs4.element.Tag。但是注意,它查找的是在所有内容中的第一个符合要求的标签。

print(type(bs.a))

对于 Tag,它有两个重要的属性,是 name 和 attrs:

2.NavigableString

既然我们已经得到了标签的内容,那么问题来了,我们要想获取标签内部的文字怎么办呢?很简单,用 .string 即可

print(type(bs.title.string))

3.BeautifulSoup

BeautifulSoup对象表示的是一个文档的内容。大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称,以及属性

4.Comment

Comment 对象是一个特殊类型的 NavigableString 对象,其输出的内容不包括注释符号。

四、遍历文档树

1、.contents:获取Tag的所有子节点,返回一个list

# tag的.content 属性可以将tag的子节点以列表的方式输出print(bs.head.contents)# 用列表索引来获取它的某一个元素print(bs.head.contents[1])

2、.children:获取Tag的所有子节点,返回一个生成器

for child in bs.body.children: print(child)

3.descendants:获取Tag的所有子孙节点

4、.strings:如果Tag包含多个字符串,即在子孙节点中有内容,可以用此获取,而后进行遍历

5、.stripped_strings:与strings用法一致,只不过可以去除掉那些多余的空白内容

6、.parent:获取Tag的父节点

7、.parents:递归得到父辈元素的所有节点,返回一个生成器

8、.previous_sibling:获取当前Tag的上一个节点,属性通常是字符串或空白,真实结果是当前标签与上一个标签之间的顿号和换行符

9、.next_sibling:获取当前Tag的下一个节点,属性通常是字符串或空白,真是结果是当前标签与下一个标签之间的顿号与换行符

10、.previous_siblings:获取当前Tag的上面所有的兄弟节点,返回一个生成器

11、.next_siblings:获取当前Tag的下面所有的兄弟节点,返回一个生成器

12、.previous_element:获取解析过程中上一个被解析的对象(字符串或tag),可能与previous_sibling相同,但通常是不一样的

13、.next_element:获取解析过程中下一个被解析的对象(字符串或tag),可能与next_sibling相同,但通常是不一样的

14、.previous_elements:返回一个生成器,可以向前访问文档的解析内容

15、.next_elements:返回一个生成器,可以向后访问文档的解析内容

16、.has_attr:判断Tag是否包含属性

python中beautifulsoup是什么库_BeautifulSoup库详解(个人整理)相关推荐

  1. Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介、案例应用(python中的编码格式及常见编码问题详解)之详细攻略

    Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介.案例应用(python中的编码格式及常见编码问题详解)之详细攻略 目录 符串编码(ASCII编码/GB ...

  2. python中append函数解析_对python中的pop函数和append函数详解

    对python中的pop函数和append函数详解 pop()函数 1.描述 pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. 语法 pop()方法语法: list. ...

  3. python中的class怎么用_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  4. python中class变量_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  5. python中if语句的实例_对python中if语句的真假判断实例详解

    说明 在python中,if作为条件语句,当if后面的条件参数为真时,则执行后面的语句块,反之跳过,为了深入理解if语句,我们需要知道if语句的真假判断方式. 示例 在python交互器中,经过测试发 ...

  6. Python中的list/tuple/dict/set数据类型详解

    Python中的list/tuple/dict/set数据类型详解 Python内部内置了一些数据类型与结构,可以方便在编程时候的使用. list List存储一系列的有序集合,并且元素内容可变(可更 ...

  7. 站长在线Python精讲:在Python中匹配字符串的3个方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中匹配字符串的3个方法详解>.本知识点主要内容有:使用match()方法进行匹配.使用search()方法进行 ...

  8. 站长在线Python精讲:在Python中格式化字符串的两种方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中格式化字符串的两种方法详解>.本知识点主要内容有:使用%操作符格式化字符串和使用format()方法格式化字 ...

  9. Python中Print()函数的用法___实例详解(二)(全,例多)

    Python中Print()函数的用法___实例详解(二)(全,例多) 目录 十一.Print()小例子 十二.Print()中文输入显示乱码问题 十三.Print()写入文件 十四.print()在 ...

  10. python中的pop函数和append函数_对python中的pop函数和append函数详解

    pop()函数 1.描述 pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. 语法 pop()方法语法: list.pop(obj=list[-1]) 2.参数 obj ...

最新文章

  1. java 获取泛型t的class_阿里巴巴都鼎力推荐的java基础之集合其他内容和泛型3
  2. 国内NLP竞赛平台一览(附平台连接)
  3. openvidu部署
  4. python get 下载 目录_python实现支持目录FTP上传下载文件的方法
  5. MySQL高级 - 常用工具 - mysql
  6. netty系列之:一个价值上亿的网站速度优化方案
  7. python学习-类(类方法、实例方法、静态方法)
  8. 每个Java开发人员应拥有的持久断点
  9. opencv 在工业中的应用:blob分析
  10. LeetCode 1116. 打印零与奇偶数
  11. IIS 7管理API——Microsoft.Web.Administration介绍
  12. linux下svn的用法
  13. 页面body元素#65279导致顶部空白一行解决方法
  14. 关于synchronized
  15. 实现一个文本文件的解析类(vector,字符串解析的应用)
  16. 漫画小程序支持流量主更新修复接口,自动采集资源,漫画源码漫画小程序源码简单即可发布
  17. IDEA的依赖包报红问题
  18. mysql密码怎么解密_MySQL密码加密与解密详解
  19. WiFi 中继/桥接功能 — 基于OpenWRT路由器
  20. 编码器控制电机正反转梯形图_怎么用编码器控制电机位移距离

热门文章

  1. 现代制造工程课堂笔记03:第二部分(含易考点与必考点)
  2. C++STL总结笔记(一)—— 容器和容器适配器
  3. 静止的单摄像机无法得到像点的三维坐标详解
  4. php函数库快速记忆法_PHP速成大法
  5. 第4章 Python 数字图像处理(DIP) - 频率域滤波11 - 使用高通滤波器锐化图像
  6. c语言输出去掉最后一行回车,新人提问:如何将输出时每行最后一个空格删除...
  7. 微信小程序--页面传参
  8. 多个DataSet数据合并
  9. ubuntu14.04 python2.7 安装配置OpenCV3.0
  10. 开发中的问题——环境相关