博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python爬虫--- 1.3 BS4库的解析器
阅读量:7230 次
发布时间:2019-06-29

本文共 3121 字,大约阅读时间需要 10 分钟。

原文链接

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

bs4解析器的选择

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

bs4库官方推荐我们使用的是lxml解析器,原因是它具有更高的效率,所以我们也将采用lxml解析器。

lxml解析器的安装:

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

$ pip install lxml

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

使用lxml解析器来解释网页

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

html_doc = """    The Dormouse's story        

The Dormouse's story

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

...

"""

试一下吧:

import bs4#首先我们先将html文件已lxml的方式做成一锅汤soup = bs4.BeautifulSoup(open('Beautiful Soup 爬虫/demo.html'),'lxml')#我们把结果输出一下,是一个很清晰的树形结构。#print(soup.prettify())'''OUT:      The Dormouse's story      

The Dormouse's story

Once upon a time there were three little sisters; and their names were Elsie , Lacie and Tillie ;and they lived at the bottom of a well.

...

···

如何具体的使用?

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# The Dormouse's storysoup.title# The Dormouse's story

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

soup.body.b# The Dormouse's story

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

获取所有的标签呢?

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

tag=soup.find_all('a')# [Elsie,#  Lacie,#  Tillie]#假设我们要找到a标签中的第二个元素:need = tag[1]#简单吧

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

head_tag = soup.headhead_tag# The Dormouse's storyhead_tag.contents[The Dormouse's story]title_tag = head_tag.contents[0]print(title_tag)# The Dormouse's storytitle_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’ 。这里的‘The Dormouse‘s story’也叫作head的子孙节点

for child in head_tag.descendants:    print(child)    # The Dormouse's story    # 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 + AI 名师,打造精品的 Python + AI 技术课程。 在各大平台都长期有优质免费公开课,欢迎报名收看。

公开课地址:                       

转载地址:http://ekcfm.baihongyu.com/

你可能感兴趣的文章
CLR存储过程
查看>>
初级运维(一)
查看>>
C语言字符串常用函数学习(一)
查看>>
Lync Server 2010部署与应用(三)---拓扑生成与发布
查看>>
安全摘记1:关于安全与黑客
查看>>
我的友情链接
查看>>
tbox中vector容器的使用
查看>>
一个简单的PHP笔试题
查看>>
firebug重新载入页面获取源码
查看>>
我的友情链接
查看>>
5月末周中国.COM总量净增1.2万个 美国净减2.6万个
查看>>
Elasticsearch数据建模-关联查询
查看>>
我的友情链接
查看>>
CentOS 下安装 Lnmp
查看>>
redis系列:通过日志案例学习string命令
查看>>
世界冠军之路:菜鸟车辆路径规划求解引擎研发历程
查看>>
Linux-sendmail
查看>>
关于BSTR的困惑
查看>>
什么时候使用HashMap?它有什么特点?
查看>>
框架名
查看>>