• python3 BeautifulSoup解析库


    官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

    BeautifulSoup就是Python的一个HTML或XML的解析库,可以用它来方便地从网页中提取数据。官方解释如下:

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

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

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

    所以说,利用它可以省去很多烦琐的提取工作,提高了解析效率。

    模块安装

    使用之前,需要确保已经安装好了BeautifulSoup和lxml模块。

    pip install beautifulsoup4 lxml
    

    解析器选择

    Beautiful Soup在解析时实际上依赖解析器,它除了支持Python标准库中的HTML解析器外,还支持一些第三方解析器(比如lxml)。下表为BeautifulSoup支持的解析器:

    解析器 使用方法 优势 劣势
    Python标准库 BeautifulSoup(markup, "html.parser") Python的内置标准库、执行速度适中、文档容错能力强 Python 2.7.3及Python 3.2.2之前的版本文档容错能力差
    lxml HTML解析器 BeautifulSoup(markup, "lxml") 速度快、文档容错能力强 需要安装C语言库
    lxml XML解析器 BeautifulSoup(markup, "xml") 速度快、唯一支持XML的解析器 需要安装C语言库
    html5lib BeautifulSoup(markup, "html5lib") 最好的容错性、以浏览器的方式解析文档、生成HTML5格式的文档 速度慢、不依赖外部扩展

    通过以上对比可以看出,lxml解析器有解析HTML和XML的功能,而且速度快,容错能力强,所以推荐使用它。

    如果使用lxml,那么在初始化Beautiful Soup时,可以把第二个参数改为lxml即可:

    from bs4 import BeautifulSoup
    soup = BeautifulSoup('<p>Hello</p>', 'lxml')
    print(soup.p.string)
    

    基本用法

    from bs4 import BeautifulSoup
    import requests, re
    
    req_obj = requests.get('https://www.baidu.com')
    soup = BeautifulSoup(req_obj.text, 'lxml')
    
    '''标签查找'''
    print(soup.title)  # 只是查找出第一个
    print(soup.find('title'))  # 效果和上面一样
    print(soup.find_all('div'))  # 查出所有的div标签
    
    '''获取标签里的属性'''
    tag = soup.div
    print(tag['class'])  # 多属性的话,会返回一个列表
    print(tag['id'])  # 查找标签的id属性
    print(tag.attrs)  # 查找标签所有的属性,返回一个字典(属性名:属性值)
    
    '''标签包的字符串'''
    tag = soup.title
    print(tag.string)  # 获取标签里的字符串
    tag.string.replace_with("哈哈")  # 字符串不能直接编辑,可以替换
    
    '''子节点的操作'''
    tag = soup.head
    print(tag.title)  # 获取head标签后再获取它包含的子标签
    
    '''contents 和 .children'''
    tag = soup.body
    print(tag.contents)  # 将标签的子节点以列表返回
    print([child for child in tag.children])  # 输出和上面一样
    
    '''descendants'''
    tag = soup.body
    [print(child_tag) for child_tag in tag.descendants]  # 获取所有子节点和子子节点
    
    '''strings和.stripped_strings'''
    tag = soup.body
    [print(str) for str in tag.strings]  # 输出所有所有文本内容
    [print(str) for str in tag.stripped_strings]  # 输出所有所有文本内容,去除空格或空行
    
    '''.parent和.parents'''
    tag = soup.title
    print(tag.parent)  # 输出便签的父标签
    [print(parent) for parent in tag.parents]  # 输出所有的父标签
    
    '''.next_siblings 和 .previous_siblings
        查出所有的兄弟节点
    '''
    
    '''.next_element 和 .previous_element
        下一个兄弟节点
    '''
    
    '''find_all的keyword 参数'''
    soup.find_all(id='link2')  # 查找所有包含 id 属性的标签
    soup.find_all(href=re.compile("elsie"))  # href 参数,Beautiful Soup会搜索每个标签的href属性:
    soup.find_all(id=True)  # 找出所有的有id属性的标签
    soup.find_all(href=re.compile("elsie"), id='link1')  # 也可以组合查找
    soup.find_all(attrs={"属性名": "属性值"})  # 也可以通过字典的方式查找
    

    直接输出body

    soup.find('body').prettify()
    

    同理可输出其他标签

    更多详细使用可参考:https://cuiqingcai.com/5548.html

    参考:https://www.cnblogs.com/Jimc/p/10307947.html

  • 相关阅读:
    java Activiti 工作流引擎 SSM 框架模块设计方案
    自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    数据库设计的十个最佳实践
    activiti 汉化 stencilset.json 文件内容
    JAVA oa 办公系统模块 设计方案
    java 考试系统 在线学习 视频直播 人脸识别 springboot框架 前后分离 PC和手机端
    集成 nacos注册中心配置使用
    “感恩节 ”怼记
    仓颉编程语言的一点期望
    关于System.out.println()与System.out.print("\n")的区别
  • 原文地址:https://www.cnblogs.com/makalochen/p/14052961.html
Copyright © 2020-2023  润新知