爬虫笔记2(转)BS4库的解析器
来源:互联网 发布:xy苹果助手for mac 编辑:程序博客网 时间:2024/06/05 06:10
从零开始写Python爬虫 --- 1.3 BS4库的解析器
bs4库之所以能快速的定位我们想要的元素,是因为他能够用一种方式将html文件解析了一遍 ,不同的解析器有不同的效果。下文将一一进行介绍。
bs4解析器的选择
网络爬虫的最终目的就是过滤选取网络信息,最重要的部分可以说是解析器。解析器的优劣决定了爬虫的速度和效率。bs4库除了支持我们上文用过的‘html.parser’解析器外,还支持很多第三方的解析器,下面我们来对他们进行对比分析。
bs4库官方推荐我们使用的是lxml解析器,原因是它具有更高的效率,所以我们也将采用lxml解析器。
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.headhead_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下的所有的文本内容呢?
- 如果该tag只有一个子节点(NavigableString类型):直接使用tag.string就能找到。
- 如果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库的基本使用,我们就先介绍到这。剩下来的部分:
父节点、兄弟节点、回退和前进,都与上面从子节点找元素的过程差不多
想要具体了解可以去看一下官方文档
每天的学习记录都会 同步更新到:
微信公众号: findyourownway
知乎专栏:从零开始写Python爬虫 - 知乎专栏
blog : www.ehcoblog.ml
- 进入专栏从零开始写Python爬虫
爬墙少年的学习记录。
- 买房人可否主张继续履行购房意向书
作者:唐青林 李舒 张烨当事人只签订购房意向书,但已经具备买卖合同的主要内容的,可以认定…查看全文
- 上海迪士尼游玩亲身体验!超详细!攻略带你飞!--看完绝不后悔!哈哈哈
温馨提示:本文较长,建议慢慢看,或分多次看 ^^ 重点必看快速通行证,下软件和地图注意:我…查看全文
- 假期在家没事,何不肉身犯险,来丁山买壶?
最近很多朋友加我微信,询问买的壶好不好。今天又有个朋友发给我看,直接把我给吓懵逼了。那…查看全文
- 爬虫笔记2(转)BS4库的解析器
- 从零开始写Python爬虫 --- 1.3 BS4库的解析器
- python爬虫笔记day1 BS4库的使用
- Python爬虫(bs4)-2
- Python爬虫之bs4库
- Python爬虫(bs4)-1
- Python爬虫(bs4)-3
- python3 BS4 BeautifulSoup 解析的一些解析(迷惑点)
- requests和bs4的python爬虫入门
- 小白学爬虫-----bs4的学习-1
- 2、Beautiful Soup库(bs4)入门
- python爬虫由浅入深6--基于bs4库的HTML内容的查找方法
- python——爬虫学习——基于bs4库的HTML内容查找方法-(3)
- Python网络爬虫与信息提取-Day7-基于bs4库的HTML内容遍历方法
- Python网络爬虫与信息提取-Day8-基于bs4库的HTML格式输出
- 从零开始写Python爬虫 --- 1.2 BS4库的安装与使用
- Python爬虫(urllib2+bs4)+分析找出谁是水贴王(2)--数据分析
- bs4爬虫:获取百度贴吧的内容
- PTA:一元多项式的加乘运算
- 新的启程------加油
- Linux 磁盘原理与管理 (分区 挂载)
- 移动 Ubuntu16.04 桌面左侧的启动器到屏幕底部
- 又来了,麦枫版通达OA/office anywhere2017.10.8.171010无限用户破解可定制名称
- 爬虫笔记2(转)BS4库的解析器
- Java多线程编程-(8)-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier
- hadoop文件的读写流程
- hdu 4454(三分)
- 第一章课后练习:第二大题(问答题)
- 其他题目---一行代码求两个数的最大公约数
- 保证应用程序只运行一个实例[c#]
- bzoj 3609: [Heoi2014]人人尽说江南好(博弈)
- 线性表、链表的区别