• python网络爬虫学习笔记(二)BeautifulSoup库


    Beautiful Soup库也称为beautiful4库、bs4库,它可用于解析HTML/XML,并将所有文件、字符串转换为'utf-8'编码。HTML/XML文档是与“标签树一一对应的。具体地说,Beautiful Soup库是可以解析、遍历、维护HTML/XML文件的“标签树”的功能库。本文总结了BeautifulSoup的基本使用方法。

    一、Beautiful Soup库基本元素


    库的比较常见的引用方式如下

    from bs4 import BeautifulSoup #从Beautiful Soup库引入BeautifulSoup类
    import bs4 #直接引入Beautiful Soup库

    Beautiful Soup库可用的解析器有以下4种:

    • bs4的HTML解析器:BeautifulSoup(mk, 'html.parser')
    • lxml的HTML解析器:BeautifulSoup(mk, 'lxml')
    • lxml的XML解析器:BeautifulSoup(mk, 'xml')
    • html5lib的解析器:BeautifulSoup(mk, 'html5lb')

    BeautifulSoup类对应一个HTML/XML文档的全部内容,其5种基本元素罗列如下:

    • Tag:标签,最基本的信息组织单元,分别用<>和</>标明开头和结尾
    • Name:标签的名字,<p>...</p>的名字是'p',格式<tag>.name
    • Attributes:标签的属性,字典形式组织,格式<tag>.attrs
    • NavigableString:标签内非属性字符串,<>...</>中字符串,格式<tag>.string
    • Comment:标签内字符串的注释部分,一种特殊的Comment类型

    下面一段运行实例,其中demo是一段HTML代码

    我们看一下a标签,其父标签以及祖父标签的名字

    接下来,解析a标签的属性

    从中可以看到,属性是字典类型。

    再看一看标签本身的类型

    标签的NavigableString元素

    获取标签的Comment(与获取NavigableString比较)

    p标签包含b标签,然而p.string并不包含b标签,这说明NavigableString是可以跨越多个标签层次的。

    二、利用Beautiful Soup库遍历HTML内容


    前面提到,HTML文档其实就是一棵标签树。对HTML的遍历即是对标签树的遍历。遍历的方式分为上行遍历、下行遍历和平行遍历。

    2.1 标签树的下行遍历

    标签树的下行遍历包含三个属性

    • .contents:子节点的列表,将<tag>所有儿子节点存入列表
    • .children:子节点的迭代类型,与.content相似,用于循环遍历儿子节点
    • .descendants:子孙节点的迭代类型,包含所有子孙节点,用于循环遍历

     使用.contents获取子节点列表的示例如下

    一般地,如果要遍历子节点,可以用如下代码框架

    for child in soup.body.children:
        print(child)

    如果要遍历子孙节点,则可以用如下代码框架

    for child in soup.body.descendents:
        print(child)

    2.2 标签树的上行遍历

    上行遍历包含的属性罗列如下:

    • .parent:节点的父亲标签
    • .parents:节点先辈标签的迭代模型,用于循环遍历先辈节点

    下面是使用.parent获取父标签的一段实例

    这里看到,html是最高级的标签,因此其父标签即为自己。

    一般地,对标签树进行上行遍历,可采用如下代码框架

    for parent in soup.a.parents:
        if parent is None:
            print(parent)
        else:
            print(parent.name)

    相应给出一段运行实例:打印所有先辈标签的名字

    2.3 标签树的平行遍历

    Beautiful Soup库提供以下四种平行遍历属性:

    • .next_sibling:返回按照HTML文本顺序的下一个平行节点标签
    • .previous_sibling:返回按照HTML文本顺序的上一个平行节点标签
    • .next_siblings:迭代类型,返回按照HTML文本顺序的后续所有平行节点标签
    • .previous_siblings:迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

    值得注意的是,平行遍历是在同一个父节点下建立的。

    一段运行实例

    最后,soup.a.previous_sibling.previous_sibling没有输出,说明a标签的前一个再前一个节点标签为空。

    一般地,标签树的平行遍历可采用如下代码框架

    for sibling in soup.a.next_siblings: #遍历后续节点
        print(sibling)
    for sibling in soup.a.previous_siblings: #遍历前续节点
        print(sibling)

    三、基于Beautiful Soup库的HTML格式输出 


    bs4库提供了prettify()方法,用于对HTML的内容给出更友好的输出。

    下面是一段运行实例

    看到pretiffy()在每个标签后添加了换行符' '。将相关信息打印出来,得到如下结果

    prettify()也可以对某一个标签进行处理,示例如下

    相关内容为笔者根据中国大学MOOC网站嵩天教授的python爬虫课程所撰写的学习笔记,感谢中国MOOC学习平台提供的学习资源与嵩老师的授课。

  • 相关阅读:
    Ubuntu 12.04 root用户登录设置
    E: 无法获得锁 /var/lib/dpkg/lock open???
    每日英语:HardWired To Hate Exercise?
    每日英语:How to say No to other people
    每日英语:Family Inc.
    每日英语:An Unhappy Middle in the Middle Kingdom
    每日英语:How Many People Really Use Sina Weibo
    每日英语:The Deeply Odd Lives of Chinese Bureaucrats
    每日英语:The Tyranny Of The Queen Bee
    每日英语:Economist: China Plenty Creative, Just Not in Right Ways
  • 原文地址:https://www.cnblogs.com/Jeffrey-Y/p/10334629.html
Copyright © 2020-2023  润新知