• Python爬虫——BeautifulSoup的基本使用


    Python爬虫——BeautifulSoup的基本使用

    • 安装beautifulsoup4模块
    pip install beautifulsoup4
    
    • 1

    1.创建BeautifulSoup对象

    import bs4
    import requests
    
    url = "http://www.baidu.com"
    htmlFile = requests.get(url)  # 获取网页内容
    # apparent_encoding获取网页编码方式,自动识别网页编码
    htmlFile.encoding = htmlFile.apparent_encoding
    # 创建BeautifulSoup对象,使用lxml的方式解析HTML内容
    objSoup = bs4.BeautifulSoup(htmlFile.text, 'lxml')
    # print(objSoup)
    print(type(objSoup))  # 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1.2内容解析

    • BeautifulSoup对象.标签名:返回标签首次出现的内容
    # objSoup.tagName 返回标签首次出现的内容
    # 1.获取网页标题--标签里面的内容</span>
    title <span class="token operator">=</span> objSoup<span class="token punctuation">.</span>title
    <span class="token keyword">print</span><span class="token punctuation">(</span>title<span class="token punctuation">)</span>  <span class="token comment"># <title>百度一下,你就知道
    
    # text属性获取标签文本内容
    print(objSoup.title.text)  # 百度一下,你就知道
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • find()函数:返回HTML文件中第一次出现的标签内容。也可以用于查找某个有特定属性的标签。
    # objSoup.find('tagName')
    # find()函数可以查找HTML文件内第一个符合的标签内容
    # 1.返回标签第一次出现的内容
    first_a = objSoup.find('a')
    print(first_a)
    # 新闻
    # 2.属性定位
    # 查询class属性,需要使用class_
    findById = objSoup.find('a', class_='mnav')
    print(findById)
    # 新闻
    # 使用attrs参数
    find_attrs = objSoup.find(attrs={'class': 'mnav'})
    print(find_attrs)
    # 新闻
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • find_all():查找HTML中所有符合的标签内容,返回列表。
    # find_all():查找HTML中所有符合的标签内容,返回列表
    # 1.传入单个指定标签
    list_a = objSoup.find_all('a')    # a标签的所有内容
    print(list_a)
    for a in list_a:
        print(a.text)
        # 新闻
        # hao123
        # 地图
        # 视频
        # 贴吧
        # 登录
        # 更多产品
        # 关于百度
        # About Baidu
        # 使用百度前必读
        # 意见反馈
    # getText()获取元素内容
    for i in range(len(list_a)):
        print(list_a[i].getText)
    # 2.传入多个标签
    list2 = objSoup.find_all(['div', 'a'])
    print(list2)
    print(len(list2))
    # 3.传入正则表达式
    import re
    list3 = objSoup.find_all(re.compile('^a'))  # 查找全部以a开头的标签
    print(list3)
    list4 = objSoup.find_all(re.compile('^li'))  # 查找全部以li开头的标签
    print(list4)
    
    • 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
    • select()
      select()主要是以CSS选择器(selector)的方式寻找元素。如果找到元素,则返回元素列表;否则返回空列表。
      • 标签选择器:直接指定标签名
        • objSoup.select(‘p’):寻找所有

          标签的元素;

        • objSoup.select(‘img’):寻找所有标签的元素
        • objSoup.select(‘input[name]’):寻找所有标签且包含name属性的元素;
      • 类(class)选择器:.
        • objSoup.select('.name):寻找所有class属性为name的元素;
      • id选择器:#
        • objSoup.select('#name):寻找所有id属性为name的元素;
      • 层级选择器:
        • 单层:>
          • objSoup.select(‘div.list > ul > li > a’):查找所有class为list的div中的ul里的li标签里面的a标签;
        • 多层:空格
          • objSoup.select(‘p #name’):寻找所有

            标签且id为name的元素

          • objSoup.select(‘p .name’):寻找所有class为name的

            标签;

    # select()
    # 1.标签选择器:直接指定标签名
    list5 = objSoup.select('p')
    print(list5)
    # 2.类(class)选择器:.
    list6 = objSoup.select('.mnav')
    print(list6)
    # 3.id选择器:#
    list7 = objSoup.select('#lh')
    print(list7)
    # [

    关于百度 About Baidu

    ]
    # 层级选择器 list8 = objSoup.select('#lh a') print(list8) # [关于百度, About Baidu]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 获取标签文本内容
      • text:获取标签下的全部文本内容
      • get_text():获取标签下的全部文本内容
      • string:只能获取到标签下的直系文本内容
      • get()获取标签属性:如:a.get(‘href’)
    • 获取标签属性值
      • 通过选择器获取,如:
        • objSoup.select(‘#lh a’)[0].get(‘href’)
        • objSoup.select(‘#lh a’)[0][‘href’]
      • find()函数获取:
        • objSoup.find(‘a’)[‘href’]
      • 通过find_all方法获取:
        • objSoup.find_all(‘a’)[2][‘href’]
    # 获取标签文本内容
    # 1.text
    text = objSoup.select('#lh a')[0].text
    print(text)  # 关于百度
    
    # 2.string
    str1 = objSoup.select('#lh a')[0].string
    print(str1)  # 关于百度
    
    # 3.get_text()
    text2 = objSoup.select('#lh a')[0].get_text()
    print(text2)  # 关于百度
    
    # 使用get()获取标签中的属性
    href = objSoup.select('#lh a')[0].get('href')
    print(href)  # http://home.baidu.com
    
    first_a = objSoup.find('a')['href']
    print(first_a)  # http://news.baidu.com
    list_a = objSoup.find_all('a')[2]
    print(list_a['href'])  # http://map.baidu.com
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    参考:
  • 相关阅读:
    致远oa wpsassistservlet任意文件上传漏洞
    图神经网络驱动的交通预测技术:探索与挑战
    SpringBoot整合分布式任务调度平台xxl-job
    lua vm 一: attempt to yield across a C-call boundary 的原因分析
    STM32照相机实验
    东莞市顺昌针织厂过程质量控制研究
    ZigBee 3.0理论教程-通用-1-03:协议架构-物理层(PHY)
    ROS系统读取USB相机图像数据
    VB.NET—窗体引起的乌龙事件
    数据看板的动态截图推送方案
  • 原文地址:https://blog.csdn.net/username666/article/details/126794452