Beautiful Soup库入门

Beautiful Soup简介与安装

简介

        简单来说,Beautiful Souppython的一个库,最主要的功能是从网页抓取数据。官方解释如下:

        Beautiful Soup提供一些简单的python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

        Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时Beautiful Soup就不能自动识别编码方式了。然后你仅仅需要说明一下原始编码方式就可以了。

        Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。


安装

        Beautiful Soup3目前已经停止开发,推荐在现在的项目中使用Beautiful Soup 4,不过它已经被移植到BS4了,也就是说导入时我们需要 import bs4所以这里我们用的版本是 Beautiful Soup 4.3.2 (简称BS4)。

        可以利用 pip 或者 easy_install来安装,以下两种方法均可:

        easy_installbeautifulsoup4

        pip installbeautifulsoup4


安装小测

本文使用的网页内容如下,demo.html。也可以直接从它的链接中获取:https://python123.io/ws/demo.html。

<html>
    <head>
        <title>This is a python demo page</title>
    </head>
    <body>
        <p class="title"><b>The demo python introduces several python courses.</b></p>
        <p class="course">Python is a wonderful general‐purpose programming language. You can learn Python from novice to professional by tracking the following courses:
        <a href="http://www.icourse163.org/course/BIT‐268001" class="py1"id="link1">Basic Python</a>
        and <a href="http://www.icourse163.org/course/BIT‐1001870001" class="py2"id="link2">Advanced Python</a>.</p>
    </body>
</html>


Beautiful Soup库的基本元素

        Beautiful Soup库是解析、遍历、维护“标签树”的功能库。一个Beautiful Soup类对应一个HTML/XML文档的全部内容。

        from bs4 importBeautifulSoup;

        soup =BeautifulSoup(demo, 'html.parser');或者

        soup2 = BeautifulSoup(open(“demo.html”),'html.parser');

        如上,构造一个BeautifulSoup类的参数有两个,第一个是html/xml的文档内容,可以是本地文件,也可以是使用requests库从url上获取下来的页面内容。第二个是BeautifulSoup库的解析器,默认为html.parser,它是python内置的标准库。也可以安装其他库。


解析器

使用方法

条件

bs4的HTML解析器

BeautifulSoup(mk,'html.parser')

安装bs4库

lxml的HTML解析器

BeautifulSoup(mk,'lxml')

pip install lxml

lxml的XML解析器

BeautifulSoup(mk,'xml')

pip install lxml

html5lib的解析器

BeautifulSoup(mk,'html5lib')

pip install html5lib


        Html中一个标签的大致组成如下图所示,有标签名,属性,以及标签之间的内容等一些元素组成。所以对应的Beautiful Soup解析库也有类似的基本元素。


BeautifulSoup类的基本元素

基本元素

说明

Tag

标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾

Name

标签的名字,<p>…</p>的名字是'p',格式:<tag>.name

Attributes

标签的属性,字典形式组织,格式:<tag>.attrs

NavigableString

标签内非属性字符串,<></>中字符串,格式:<tag>.string

Comment

标签内字符串的注释部分,一种特殊的Comment类型


Tag

任何存在于HTML语法中的标签都可以用soup.<tag>访问获得当HTML文档中存在多个相同<tag>对应内容时,soup.<tag>返回第一个。



Tag的名字(name)

标签<a>…</a>的名字就是’a’, 标签<title>…</title>的名字就是’title’。 soup 对象本身比较特殊,它的 name 即为 [document],对于其他内部标签,输出的值便为标签本身的名称。



Tag的属性(attrs)

一个<tag>可以有0或多个属性,字典类型。如果我们想要单独获取某个属性,可以使用名称索引。还可以利用get方法,传入属性的名称,二者是等价的。我们可以对这些属性和内容等等进行修改,例如:soup.p['class'] = ‘newClass’; 还可以对这个属性进行删除,例如:del soup.p['class']。



Tag的标签内非属性字符串

Tag的NavigableString,标签内非属性字符串,也就是tag的内容。NavigableString可以跨越多个层次。



Tag的Comment

标签内字符串的注释部分,一种特殊的Comment类型。Html的注释形式为:<!--  -->。



基于bs4库的HTML内容遍历方法


标签树的下行遍历

属性

说明

.contents

子节点的列表,将<tag>所有儿子节点存入列表

.children

子节点的迭代类型,与.contents类似,用于循环遍历儿子节点

.descendants

子孙节点的迭代类型,包含所有子孙节点,用于循环遍历

        

        BeautifulSoup类型是标签树的根节点。


        

        .children和.descendants属性返回的是迭代类型,不能直接使用,必须使用循环,这样遍历的就是某个Tag的所有子节点,或者所有子孙节点。

        遍历儿子节点

        for child insoup.body.children:

                print(child)

        遍历子孙节点

        for child insoup.body.descendants:

                print(child)


标签树的上行遍历

属性

说明

.parent

节点的父亲标签

.parents

节点先辈标签的迭代类型,用于循环遍历先辈节点



标签树的平行遍历

属性

说明

.next_sibling

返回按照HTML文本顺序的下一个平行节点标签

.previous_sibling

返回按照HTML文本顺序的上一个平行节点标签

.next_siblings

迭代类型,返回按照HTML文本顺序的后续所有平行节点标签

.previous_siblings

迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

        

        首先需要注意的就是:只有同一个父节点下的各个节点之间才称作平行关系。并且标签之间的内容,即.string,也会被当作一个节点被遍历。


        

        类似于.children和.descendants属性的使用,循环遍历所以的平行节点:

        遍历后续节点

        forsibling in soup.a.next_sibling:

                print(sibling)

        遍历前续节点

        forsibling in soup.a.previous_sibling:

                print(sibling)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值