zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    一句话解释c#中的特性,你了解多少
    CentOS虚拟机如何设置共享文件夹,并在Windows下映射网络驱动器?
    samba服务器配置及window网络磁盘映射
    PHP中各种Hash算法性能比较
    Redis持久化
    设置redis主从出现的问题
    Redis启动多端口、运行多实例
    Redis学习手册(主从复制)
    tengine/nginx-tomcat动静分离遇到的问题
    使用 Git Hooks 实现自动项目部署
  • 原文地址:https://www.cnblogs.com/makalochen/p/14052961.html
Copyright © 2011-2022 走看看