• day22-bs4数据解析


    第二阶段day2-bs4数据解析

    request设置浏览器信息

    418现象:网页对应的服务器做了身份验证,必须浏览器才能返回数据。如果不是浏览器发送的请求就会返回418
    解决办法:设置请求的请求头中的用户信息为一个浏览器

    import requests
    
    headers = {
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'
    }
    response = requests.get('https://movie.douban.com/top250', headers = headers)
    if response.status_code == 200:
        print(response.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    bs4基本用法

    1.创建网页对应的beautifulSoup对象
    BeautifulSoup(网页数据,解析器名称)

    ​ 网页数据——需要解析的网页源代码
    ​ 解析器名称——lxml

    from bs4 import BeautifulSoup
    
    html = open('data.html', encoding='utf-8').read()
    soup = BeautifulSoup(html, 'lxml')
    
    • 1
    • 2
    • 3
    • 4

    2.获取标签

    soup对象.select(css选择器)——在整个网页中获取css选择器选中的所有标签,返货值是列表,列表中的元素是标签对象
    soup对象.select_one(css选择器)——在整个网页中获取css选择器选中的标签中的第一个标签,返回值撕标签对象
    标签对象.elect(css选择器)——在指定标签中获取css选择器选中的所有标签,返货值是列表,列表中的元素是标签对象
    标签对象.select(css选择器)——在指定标签中获取css选择器选中的标签中的第一个标签,返回值撕标签对象

    soup.select()
    soup.select_one()
    
    • 1
    • 2

    3.获取标签内容,获取标签属性
    1)获取标签内容 标签对象.text

    a = soup.select_one('div.c1>a')
    print(a.text)
    
    • 1
    • 2

    2)获取标签属性:标签对象.attrs[属性名]

    print(a.attrs['href'])
    
    • 1

    练习:

    如图文件data.html,内容如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <!-- .c3  -->
    <!--    .c3 -->
        <a class="c3">我是超链接0</a>
        <span class="c3">我是span0</span>
        <div class="c1">
            <div>
                <p>我是段落1</p>
            </div>
            <p>我是段落2</p>
            <a href="https://www.baidu.com">我是超链接2</a>
        </div>
        <div class="c2">
            <p>我是段落3</p>
            <a>我是超链接2</a>
        </div>
    
        <ul class="goods_list">
            <li>
                <p class="name">泡面</p>
                <p class="price">3.5</p></li>
    
            <li>
                <p class="name">火腿肠</p>
                <p class="price">2</p></li>
    
            <li>
                <p class="name">矿泉水</p>
                <p class="price">1</p></li>
        </ul>
    
        <ul class="course_list">
            <li>
                <p class="name">数据分析</p>
                <p class="price">20000</p>
                <span>23周</span>
            </li>
            <li>
                <p class="name">前端开发</p>
                <p class="price">22000</p>
                <span>23周</span>
            </li>
            <li>
                <p class="name">java后端</p>
                <p class="price">23000</p>
                <span>23周</span>
            </li>
        </ul>
    </body>
    </html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    练习1:获取所有课程的名字

    from bs4 import BeautifulSoup
    
    html = open('data.html', encoding='utf-8').read()
    soup = BeautifulSoup(html, 'lxml')
    
    p = soup.select('.course_list .name')
    course_name = [x.text for x in p]
    print(course_name)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    练习2:获取第二个课程的价格

    p = soup.select('.course_list .price')[1]
    print(p.text)
    p = soup.select_one('.course_list>li:nth-child(2)>.price')
    print(p.text)
    
    • 1
    • 2
    • 3
    • 4

    练习3:获取所有的课程以及对应的价格

    # 方法一:
    p = soup.select('.course_list p')
    for i in p:
        print(i.text)
    # 方法二:
    course_li = soup.select('.course_list li')
    all_course = []
    for li in course_li:
        name = li.select_one('.name').text
        price = li.select_one('.price').text
        time = li.select_one('span').text
        all_course.append({'name': name, 'price': price, 'time': time})
    print(all_course)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    Android通知监听服务之NotificationListenerService使用篇
    堆--图文详解
    确定Mac\Linux系统的架构类型是 x86-64(amd64),还是 arm64 架构
    通信缓冲数据ModBusRTU
    【java】【SSM框架系列】【三】Maven进阶
    2023最新版本 FreeRTOS教程 -6-创建多个任务使用相同的任务函数
    六、stm32-OLED
    【Java中23种面试常考的设计模式之模板模式(Template)---行为型模式】
    P2558 [AHOI2002] 网络传输提交,位运算,高精度
    控制期货开户保证金可以降低风险
  • 原文地址:https://blog.csdn.net/qq_40752621/article/details/125451932