zoukankan      html  css  js  c++  java
  • beautifulsoup4

    介绍

    Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
    
    Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
    
    Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

     使用方法

    (1) 根据标签名查找
        - suop.a 只能找到第一个符合要求的标签
    (2) 获取属性值
        - suop.a.attrs         获取a所有的属性和属性值,返回一个字典
        - suop.a.attrs["href"] 获取href属性值
        - suop.a["href"]       简写为这种形式
    (3) 获取内容
        - suop.a.string        获取标签中直系的文本内容
        - suop.a.text          获取所有标签中的文本内容
        - suop.a.get_text()    获取所有标签中的文本内容
       【注意】如果标签中还有标签,那么string获取到的结果为None,其他两个方法可以获取到文本内容
    (4) find 找到第一个符合要求的标签
        - suop.find("a")       找到第一个符合要求的
        # 根据标签中的属性获取指定的a标签
        - suop.find("a", class_="xxx")  # class是关键字需要加_
        - suop.find("a", id="xxx")
        - suop.find("a", href="xxx")
        - suop.find("a", alt="xxx")
        - suop.find("a", tetle="xxx")
        # 可以和获取内容的方法连用
        - suop.find("a",href="/hecheng/27.html").text
    (5) find_all 找到所有符合要求的标签
        - suop.find_all("a")
        - suop.find_all(["a","p"])  找到所有a标签和p标签
        - suop.find_all(["a","p"],limit=2)   取前两个
    (6) 根据选择器选择指定的内容
        select:suop.select("#id")
        - 常见的选择器:标签选择器(a)|类选择器(.)|id选择器(#)|层级选择器
        - 层级选择器:
            div .mm         div下面所有class属性值为mm的,子子孙孙,下面多级
            div > .dd       div儿子级class属性为dd的,下面一级
        【注意】查询到的是所有数据,返回列表

    示例

    import requests
    from bs4 import BeautifulSoup
    url = "http://www.shicimingju.com/book/sanguoyanyi.html"
    response = requests.get(url).text 
    suop = BeautifulSoup(response,'lxml') # 实例化对象,使用lxml进行解析
    a_list = suop.select('.book-mulu > ul > li > a')
    url = "http://www.shicimingju.com"
    for a in a_list:
        fiction_name = a.string   # 小说章节名称
        fiction_url = url+a["href"]  # 小说章节url地址
        response = requests.get(fiction_url).text  # 请求每个章节的url地址
        suop = BeautifulSoup(response,'lxml')
        content = suop.find("div",class_="chapter_content").text  # 获取标签内所有文本数据
        with open("./{}.txt".format(fiction_name),"w",encoding="utf-8") as fp:
            fp.write(content)
    print("下载成功!!!")
    View Code

    相关小结

    from bs4 import BeautifulSoup
    如何实例化一个BeautifulSoup对象
        本地加载:
        soup = BeautifulSoup(fp,'lxml')
        网络加载:
        soup = BeautifulSoup(page_text,'lxml')
    
    相关的属性和方法
        soup.tagName:定位标签(只可以定位到第一次出现的标签),返回的永远是一个单数
        soup.find(tagName,attrName="value"):基于属性定位实现的标签定位。返回的永远是一个单数
        soup.find_all():返回的永远是一个列表
        取文本:
        string:取得标签中直系的文本内容
        text/get_text():取得的是标签下面所有的文本内容
        取属性:tag['attrName']
        
        select:使用选择器定位标签。返回的是列表
        
        标签,类,id选择器:select('选择器')
        层级选择器:
            单层级:'.tang > ul > li
            多层级:'.tang li
    View Code
  • 相关阅读:
    ZOJ3329One Person Game(循环型 数学期望)
    ZOJ3551Bloodsucker (数学期望)
    HDU3853LOOPS (师傅逃亡系列•三)(基础概率DP)
    HDU4035 Maze(师傅逃亡系列•二)(循环型 经典的数学期望)
    阿里云DataV专业版发布,为可视化创造更多可能!
    Logtail提升采集性能
    达摩院首席数据库科学家李飞飞:云原生新战场,我们如何把握先机?
    什么是最佳的视频用户体验?阿里云视频服务四大体验优化实践
    Lambda plus: 云上大数据解决方案
    基于大数据的舆情分析系统架构
  • 原文地址:https://www.cnblogs.com/Rxtong/p/10671952.html
Copyright © 2011-2022 走看看