zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    73. Set Matrix Zeroes
    289. Game of Live
    212. Word Search II
    79. Word Search
    142. Linked List Cycle II
    141. Linked List Cycle
    287. Find the Duplicate Number
    260. Single Number III
    137. Single Number II
    Oracle EBS中有关Form的触发器的执行顺序
  • 原文地址:https://www.cnblogs.com/wangyue0925/p/11225016.html
Copyright © 2011-2022 走看看