bs4库解析器怎么使用-创新互联-成都快上网建站

bs4库解析器怎么使用-创新互联

创新互联www.cdcxhl.cn八线动态BGP香港云服务器提供商,新人活动买多久送多久,划算不套路!

公司主营业务:网站设计制作、成都网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联公司推出河津免费做网站回馈大家。

这篇文章将为大家详细讲解有关bs4库解析器怎么使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

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

bs4解析器的选择

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

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

lxml解析器的安装:

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

pip install 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 story

soup.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.head
head_tag
# The Dormouse's story

head_tag.contents
[The Dormouse's story]
title_tag = head_tag.contents[0]
print(title_tag)
# The Dormouse's story
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 的子节点是The Dormouse's story,这里 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库解析器怎么使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


文章名称:bs4库解析器怎么使用-创新互联
网站路径:http://kswjz.com/article/digjjg.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流