bs4库之所以能快速的定位我们想要的元素,是因为他能够用一种方式将html文件解析了一遍 ,不同的解析器有不同的效果。下文将一一进行介绍。

bs4解析器的选择

网络爬虫的最终目的就是过滤选取网络信息,最重要的部分可以说是解析器。解析器的优劣决定了爬虫的速度和效率。bs4库除了支持我们上文用过的‘html.parser’解析器外,还支持很多第三方的解析器,下面我们来对他们进行对比分析。

bs4库官方推荐我们使用的是lxml解析器,原因是它具有更高的效率,所以我们也将采用lxml解析器。
PS注意:很多人学Python过程中会遇到各种烦恼问题,没有人解答容易放弃。为此小编建了个Python全栈免费答疑.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,不懂的问题有老司机解决里面还有最新Python实战教程免非下,,一起相互监督共同进步!

lxml解析器的安装:

  • 依旧采用pip安装工具来安装:
$ pip install lxml

注意,由于我用的是unix类系统,用pip工具十分的方便,但是如果在windows下安装,总是会出现这样或者那样的问题,这里推荐win用户去lxml官方,下载安装包,来安装适合自己系统版本的lxml解析器。

使用lxml解析器来解释网页

我们依旧以上一篇的 爱丽丝文档 为例子

    html_doc = """<html><head><title>The Dormouse's story</title></head><body><p class="title"><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>"""

试一下吧:

import bs4#首先我们先将html文件已lxml的方式做成一锅汤
soup = bs4.BeautifulSoup(open('Beautiful Soup 爬虫/demo.html'),'lxml')#我们把结果输出一下,是一个很清晰的树形结构。
#print(soup.prettify())'''
OUT:<html><head><title>The Dormouse's story</title></head><body><p class="title"><b>The Dormouse's story</b></p><p class="story">Once upon a time there were three little sisters; and their names were<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>and<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p><p class="story">...</p></body>
</html>
'''

如何具体的使用?

bs4 库首先将传入的字符串或文件句柄转换为 Unicode的类型,这样,我们在抓取中文信息的时候,就不会有很麻烦的编码问题了。当然,有一些生僻的编码 如:‘big5’,就需要我们手动设置编码:
soup = BeautifulSoup(markup, from_encoding="编码方式")

对象的种类:

bs4 库将复杂的html文档转化为一个复杂的树形结构,每个节点都是Python对象 ,所有对象可以分为以下四个类型:Tag , NavigableString , BeautifulSoup , Comment
我们来逐一解释:

Tag: 和html中的Tag基本没有区别,可以简单上手使用

NavigableString: 被包裹在tag内的字符串

BeautifulSoup: 表示一个文档的全部内容,大部分的时候可以吧他看做一个tag对象,支持遍历文档树和搜索文档树方法。

Comment:这是一个特殊的NavigableSting对象,在出现在html文档中时,会以特殊的格式输出,比如注释类型。

搜索文档树的最简单的方法就是搜索你想获取tag的的name:

soup.head
# <head><title>The Dormouse's story</title></head>soup.title
# <title>The Dormouse's story</title>

如果你还想更深入的获得更小的tag:例如我们想找到body下的被b标签包裹的部分

soup.body.b
# <b>The Dormouse's story</b>

但是这个方法只能找到按顺序第一个出现的tag

获取所有的标签呢?

这个时候需要find_all()方法,他返回一个列表类型

tag=soup.find_all('a')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
#假设我们要找到a标签中的第二个元素:
need = tag[1]
#简单吧

tag的.contents属性可以将tag的子节点以列表的方式输出:

head_tag = soup.head
head_tag
# <head><title>The Dormouse's story</title></head>head_tag.contents
[<title>The Dormouse's story</title>]
title_tag = head_tag.contents[0]
print(title_tag)
# <title>The Dormouse's story</title>
title_tag.contents
# [u'The Dormouse's story']
  • 另外通过tag的 .children生成器,可以对tag的子节点进行循环:
for child in title_tag.children:print(child)# The Dormouse's story
  • 这种方式只能遍历出子节点。如何遍历出子孙节点呢?

子孙节点:比如 head.contents 的子节点是<title>The Dormouse's story</title>,这里 title本身也有子节点:‘The Dormouse‘s story’ 。这里的‘The Dormouse‘s story’也叫作head的子孙节点

for child in head_tag.descendants:print(child)# <title>The Dormouse's story</title># The Dormouse's story

如何找到tag下的所有的文本内容呢?

1、如果该tag只有一个子节点(NavigableString类型):直接使用tag.string就能找到。

2、如果tag有很多个子、孙节点,并且每个节点里都string:

我们可以用迭代的方式将其全部找出:

for string in soup.strings:print(repr(string))# u"The Dormouse's story"# u'\n\n'# u"The Dormouse's story"# u'\n\n'# u'Once upon a time there were three little sisters; and their names were\n'# u'Elsie'# u',\n'# u'Lacie'# u' and\n'# u'Tillie'# u';\nand they lived at the bottom of a well.'# u'\n\n'# u'...'# u'\n'好了,关于bs4库的基本使用,我们就先介绍到这。剩下来的部分:父节点、兄弟节点、回退和前进,都与上面从子节点找元素的过程差不多,总结很多人学Python过程中会遇到各种烦恼问题,没有人解答容易放弃。为此小编建了个Python全栈免费答疑.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,不懂的问题有老司机解决里面还有最新Python实战教程免非下,,一起相互监督共同进步!本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

Python爬虫BS4库的解析器正确使用方法相关推荐

  1. python爬虫bs4库_04 Python爬虫之Beautiful Soup库

    Beautiful Soup库的安装 Win平台: 以管理员身份运行 cmd 执行 pip install beautifulsoup4 Beautiful Soup库的安装小测 首先,获取网页源码保 ...

  2. Python爬虫(十二)_BeautifulSoup4 解析器

    CSS选择器:BeautifulSoup4 和lxml一样,Beautiful Soup也是一个HTML/XML的解析器,主要的功能也是如何解析和提取HTML/XML数据. lxml只会局部遍历,而B ...

  3. python爬虫之bs4库_三分钟搞定bs4库的解析器

    The Dormouse's story Once upon a time there were three little sisters; and their names were Elsie, L ...

  4. Python爬虫高级库之一的lxml库中,ET.parse()是一个非常重要的方法。它可以将任意XML或HTML格式的文档解析成一个ElementTree对象,...

    Python爬虫高级库之一的lxml库中,ET.parse()是一个非常重要的方法.它可以将任意XML或HTML格式的文档解析成一个ElementTree对象,方便我们对结构化的数据进行处理和分析.在 ...

  5. Python 爬虫 bs4 数据解析基本使用

    Python 爬虫 bs4 基本使用 1. bs4 基本语法 1.1 获取 html 页面 1.2 获取标签 1.3 获取标签中的内容 1.4 获取标签中的属性 2. 实例 免责声明:自本文章发布起, ...

  6. python爬虫详细步骤-Python爬虫的两套解析方法和四种爬虫实现过程

    对于大多数朋友而言,爬虫绝对是学习 python 的最好的起手和入门方式.因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门.本文想针对某一网页对 python 基础 ...

  7. 【python】python爬虫requests库详解

    1.安装:pip install requests 简介:Requests是一个优雅而简单的Python HTTP库,与之前的urllibPython的标准库相比,Requests的使用方式非常的简单 ...

  8. Python爬虫 —— urllib库的使用(get/post请求+模拟超时/浏览器)

    Python爬虫 -- urllib库的使用(get/post请求+模拟超时/浏览器) 这里写目录标题 Python爬虫 -- urllib库的使用(get/post请求+模拟超时/浏览器) 1.Py ...

  9. python爬虫之创建和解析xlm文件

    python爬虫之创建和解析xlm文件: 1.python代码创建xlm字符串(使用xml库方法): import xml.etree.ElementTree as ET bookstore = ET ...

最新文章

  1. 得到最后的自增长列的最后一个值
  2. 简单入门循环神经网络RNN:时间序列数据的首选神经网络
  3. windows 下常用命令行
  4. Future 和 ExecutorCompletionService 对比和使用
  5. Centos7 下安装配置tomcat7
  6. ​再见 Seaborn!Altair 数据可视化已超神
  7. SEO之Google--PageRank优化剖析(三)
  8. 从分布式环境的特点、问题到CAP、BASE理论详解
  9. iservice封装有哪些方法_对WebService的一些封装技巧总结
  10. 用segnet训练我自己的数据,实验笔记1——改变图片大小
  11. 独家揭秘,106岁的IBM靠什么完成了世纪大转型|钛度专访
  12. springboot集成kettle9
  13. 键盘模拟文件尾EOF
  14. 解决“远程会话已断开连接,因为访问被拒绝导致许可证存储的创建失败,请使用提升的权限运行远程桌面客户端”问题...
  15. STM32F100R4 单片机解密特性 ST芯片解密
  16. 【串口助手】Python从零开始制作温湿度串口上位机
  17. 深入了解 Flex 属性
  18. 如何用matlab画烧杯,matlab 微分方程求解作图这个方程怎么解,还有图象怎么出来~dN1/dt=[r1*(1-N1/K1)-m*N2]*N...
  19. 同余方程、欧拉定理、乘法逆元、定义在Zm上的矩阵求逆
  20. mysql 乱码 越南_mysql数据库乱码之保存越南文乱码解决方法

热门文章

  1. linux下u盘病毒msdos,手杀U盘中ms-dos.com病毒
  2. 51单片机89C516笔记(一)
  3. python外星人入侵游戏加随机游动_Python外星人入侵游戏(四):飞船左右移动
  4. 阿翔编程学-整理一些Javascript代码
  5. POJ 3009 Curling 2.0 {深度优先搜索}
  6. Qt编写地图综合应用27-点聚合
  7. 从粗放到精细,能量采集技术如何赋能农业智慧升级?
  8. 软考高级系统架构设计师:数学与经济管理
  9. 建立RADIUS认证服务器
  10. poi处理word内容的公式_利用poi操作word文档