Python爬虫BS4库的解析器正确使用方法

news/2024/7/19 9:35:31 标签: Python, 爬虫

 

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实战教程免非下,,一起相互监督共同进步!本文的文字及图片来源于网络加上自己的想法,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

http://www.niftyadmin.cn/n/1603640.html

相关文章

年薪20万Python工程师之Python中10个必读的PEP提案方法

什么是PEP PEP 是 Python 增强提案(Python Enhancement Proposal)的缩写。社区通过PEP来给 Python 语言建言献策&#xff0c;每个版本你所看到的新特性和一些变化都是通过PEP提案经过社区决策层讨论、投票决议&#xff0c;最终才有我们看到的功能。写到这里&#xff0c;给大家…

教你用树莓派Python打造一个音乐播放器

买了个树莓派3B&#xff0c;装好系统后灰落了好厚一层都不知道要干嘛。。。最近突发奇想&#xff1a;用树莓派做一个音乐播放器&#xff0c;每天6:30-7:20自动播放英语听力&#xff0c;强迫自己练习英语&#xff0c;也治治自己的懒床习惯&#xff0c;平时也可以用来听听歌。在这…

Python爬虫系列之 xpath:html解析神器

通过前面的文章&#xff0c;我们已经知道了如何获取网页和下载文件&#xff0c;但是前面我们获取的网页都是未经处理的&#xff0c;冗余的信息太多&#xff0c;无法进行分析和利用 这一节我们就来学习怎么从网页中筛选自己需要的信息&#xff0c;顺便给大家推荐一个资源很全的…

教你用Python定时抓取微博评论,相当牛逼的技术

【Part1——理论篇】 试想一个问题&#xff0c;如果我们要抓取某个微博大V微博的评论数据&#xff0c;应该怎么实现呢&#xff1f;最简单的做法就是找到微博评论数据接口&#xff0c;然后通过改变参数来获取最新数据并保存。首先从微博api寻找 抓取评论的接口&#xff0c;如下…

学习Python装饰器,正确的使用方法详解,看这一篇文章就够了

讲 Python 装饰器前&#xff0c;我想先举个例子&#xff0c;虽有点污&#xff0c;但跟装饰器这个话题很贴切。 谈装饰器前&#xff0c;还要先要明白一件事&#xff0c;Python 中的函数和 Java、C不太一样&#xff0c;Python 中的函数可以像普通变量一样当做参数传递给另外一个函…

Python爬虫进阶教程:抖音APP无水印视频批量下载

一、前言 本文为两类人准备&#xff1a;技术控和工具控。 如果你是工具控&#xff0c;想简单方便地下载无水印的视频&#xff0c;那么可以使用第三方去水印平台&#xff1a;、 抖音短视频解析下载平台 如果你是技术控&#xff0c;想要使用自己写的代码下载视频&#xff0c;那…

超级牛逼,用python制作全国身份证号验证及查询系统

前言 本系统可以实现身份证号真伪验证&#xff0c;年龄、性别及发证地查询&#xff0c;看起来是不是很高大上&#xff0c;其实做起来不是很复杂&#xff0c;涉及知识主要有python字符串处理、表格读写和Gui制作&#xff0c;适合有一定python基础的朋友练手 实现效果图&#x…

Python中的三个骚操作和黑魔法技术,装逼必备

本文主要介绍Python的高级特性&#xff1a;列表推导式、迭代器和生成器&#xff0c;是面试中经常会被问到的特性。因为生成器实现了迭代器协议&#xff0c;可由列表推导式来生成&#xff0c;所有&#xff0c;这三个概念作为一章来介绍&#xff0c;是最便于大家理解的&#xff0…