• Beautisoup库


    所看视频: https://www.bilibili.com/video/av9784617/?p=34

    一, Beautifulsoup是一个可以从HTML或XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式

    二,安装: pipenv install beautifulsoup4

    import requests
    from bs4 import BeautifulSoup
    
    
    r = requests.get('https://python123.io/ws/demo.html')
    demo = r.text
    # print(demo)
    
    soup = BeautifulSoup(demo, 'html.parser')
    print(soup.prettify())
    

     三,Beautiful Soup库的基本元素:

    """
    Beautifulsoup类的基本元素:
    1)标签: tag 最基本的信息组织单元, 分别用<>和</>标明开头和结尾
    2)标签的名字: Name soup.标签.name
    3)Attributes: 标签的属性, 字典形式组织, 格式 标签.attrs
    4)NavigableString: 标签内非属性字符串, 标签.string
    5)Comment: 标签内字符串的注释部分, 一种特殊的Comment类型
    """

    # beautifulsoup 库的基本元素
    # 获取 .a标签 第一个.a标签
    # print(soup.a)
    # 获取 title
    # print(soup.title)

    # 获取a标签的名字
    # print(soup.a.name)
    # 获取a标签的父亲的名字
    # print(soup.a.parent.name)
    # 查看a标签的属性
    # print(soup.a.attrs) # 字典格式
    # print(soup.a.attrs['class'])
    # print(type(soup.a.string))

    # 有comment(注释)部分的处理
    b = BeautifulSoup("<b><!--This is a comment --></b>", 'html.parser')
    print(type(soup.b.string)) #

     四,基于bs4的HTML内容遍历方法

    # 基于bs4库的HTML内容遍历方法
    """
    标签数的下行遍历
    .contents 子节点的列表, 将<tag>所有儿子节点存入列表
    .children 子节点的迭代类型,与.contents类似,用于循环遍历儿子节点
    .descendants 子节点的迭代类型, 包含所有子孙节点,用于循环遍历
    """
    # 获取head 和body的儿子节点
    contens = soup.head.contents
    body_list = soup.body.contents
    # print(body_list[1])
    
    # 遍历儿子节点
    # for child in soup.body.children:
    #     print(child)
    # # 遍历子孙节点:
    # for child in soup.body.descendants:
    #     print(child)
    
    """
    标签数的上行遍历
    .parent 节点的父亲标签
    .parents 节点先辈标签的迭代类型,用于循环遍历先辈节点
    """
    # print(soup.head.parent)
    # print(soup.head.parents)
    
    """
    标签数的平行遍历 (条件 必须是一个父亲节点下的)
    .next_sibling 返回按照HTML文本顺序的下一个平行节点标签
    .previous_sibling 返回按照HTML文本顺讯的上一个平行节点标签
    .next_siblings: 迭代类型, 返回按照HTML顺序的后续所有平行节点标签
    .previous_siblings: 迭代类型, 返回按照HTML顺序的前序所有平行节点标签
    """
    

     五,信息标记的三种形式:

    1)xml: 最早的通用信息标记语言, 可扩展性好,但繁琐

    2)json:信息有类型,适合程序处理(js), 较XML简洁

    3)YAML: 无类型键值对, 文本信息比例最高

    六,基于bs4库的HTML内容查找方法

    1)find_all(name, attr, recursive, string, **kwargs)
    返回一个类表类型,存储查找的结果
    name: 对标签名称的检索字符串
    attrs: 对标签属性值的检索字符串, 可标注属性检索
    recursive: 是否对子孙全部检索, 默认为True
    string:soup.find_all(string = 'Basic Python)
    
    扩展方法:
    1)<>.find(): 搜索且只返回一个结果,字符串类型,同.find_all()参数
    2)<>.find_parents():在先辈节点中搜索,返回列表类型, 同find_all()参数
    3)<>.find_parent(): 在先辈节点中返回一个结果, 字符串类型
    4)<>.find_next_siblings():后续平行节点中搜索,返回列表类型
    5)<>.find_next_sibling():后续平行节点返回一个结果,字符串类型
    6)<>.find_previous_siblings(): 前序平行节点搜索,返回列表
    7)<>.find_previous_sibling():前序平行节点返回一个结果,字符串类型
    

     七,爬去最好大学 实例

    def getHTMLText(url):  #  从网络上获取大学排名网页内容
        
        try:
            r = requests.get(url, timeout=30)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            # print(r.text)
            return r.text
        except:
            return ''
    
    
    def fillUniversList(ulist, html):  # 提取HTML核心信息 到合适的数据结构
        soup = BeautifulSoup(html, 'html.parser')
        for tr in soup.find('tbody').children:
            if isinstance(tr, bs4.element.Tag):  # 检测标签的类型
                tds = tr('td')
                ulist.append([tds[0].string, tds[1].string, tds[2].string])
    
    
    def printUniversList(ulist, num):  # 利用数据结构展示并输出结果
        tplt = "{0:^10}	{1:{3}^10}	{2:^20}"  # {3}表示使用中文来填充
        print(tplt.format('排名', '学校', '分数', chr(12288)))  # 中文对齐问题
        for i in range(num):
            u = ulist[i]
            print(tplt.format(u[0], u[1], u[2], chr(12288)))
        
        
    def main():
        unifo = []
        url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2018.html'
        html = getHTMLText(url)
        fillUniversList(unifo, html)
        printUniversList(unifo, 20)
    main()
    
  • 相关阅读:
    mongodb添加登录验证--副本集环境
    kibana添加认证及权限--elasticsearch集群版
    Rabbitmq之exchange
    Elasticsearch集群下安装IK中文分词器
    cerebro安装--Elastic Stack之三
    elasticsearch-head安装方法--Elastic Stack之二
    动画小记——点击头像逐渐放大
    埋点
    picasso Failed to decode stream.
    记Sniper
  • 原文地址:https://www.cnblogs.com/wangyue0925/p/11225016.html
Copyright © 2020-2023  润新知