zoukankan      html  css  js  c++  java
  • bs4的简单使用

    一.使用流程

        解析流程:
            1.pip install bs4
    2.导包:from bs4 import BeautifulSoup
    3.实例化一个BeautifulSoup对象(将页面源码数据加载到该对象中)
          (1)转化本地文件: - soup = BeautifulSoup(open('本地文件'), 'lxml')
          (2)转化网络文件: - soup = BeautifulSoup('字符串类型或者字节类型', 'lxml')

    4.调用BeautifulSoup对象中的相关属性和方法进行标签的定位

    二.基本语法

    基础巩固:
        (1)根据标签名查找
            - soup.a   只能找到第一个符合要求的标签
        (2)获取属性
            - soup.a.attrs  获取a所有的属性和属性值,返回一个字典
            - soup.a.attrs['href']   获取href属性
            - soup.a['href']   也可简写为这种形式
        (3)获取内容
            - soup.a.string      获取a标签的直系文本
            - soup.a.text     这是属性,获取a子类的所有文本
            - soup.a.get_text()  这是方法,获取a标签子类的所有文本
           【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
        (4)find:找到第一个符合要求的标签
            - soup.find('a')  找到第一个符合要求的
            - soup.find('a', title="xxx") 具有title=a属性的
            - soup.find('a', alt="xxx")
            - soup.find('a', class_="xxx")
            - soup.find('a', id="xxx")
        (5)find_all:找到所有符合要求的标签
            - soup.find_all('a')
            - soup.find_all(['a','b']) 找到所有的a和b标签
            - soup.find_all('a', limit=2)  限制前两个
        (6)根据选择器选择指定的内容
                   select:soup.select('#feng')
            - 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器
                - 层级选择器:
                    div .dudu #lala .meme .xixi  下面好多级
                    div > p > a > .lala          只能是下面一级
            select就是css选择器 【注意】select选择器返回永远是列表,需要通过下标提取指定的对象

    三.重点语法find和find_all

      1. name参数的四种过滤器
       soup=Beautifulsoup('page','lxml')
      •  不带过滤器: print(soup.find_all())  #没有过滤,查找所有标签
      • 字符串过滤器: print (soup.find_all())  #字符串过滤器,即标签名
      • 列表: print(soup.find_(['a','b'])) #找到所有的a标签和b标签,任一即可
      • 正则:   print(soup.find_all(re.complie('^b'))) #找到所有b开头的标签
      • 方法: def has_class_but_no_id(tag):
          •       return tag.has_attr('class') and not tag.has_attr('id')
          • print(soup.find_all(has_class_but_no_id))
      2、按照类名查找,注意关键字是class_,class_=value,value可以是五种选择器之一
           print(soup.find_all('a',class_='sister')) #查找类为sister的a标签
           print(soup.find_all('a',class_='sister ssss')) #查找类为sister和sss的a标签,顺序错误也匹配不成功
           print(soup.find_all(class_=re.compile('^sis'))) #查找类为sister的所有标签

      3、attrs
        print(soup.find_all('p',attrs={'class':'story'}))

      4、text: 值可以是:字符,列表,True,正则
        print(soup.find_all(text='Elsie'))
        print(soup.find_all('a',text='Elsie'))
      
    `
      5、limit参数:如果文档树很大那么搜索会很慢.如果我们不需要全部结果,可以使用 limit 参数限制返回结果的数量.效果与SQL中的limit关键字类似,
      当搜索到的结果数量达到 limit 的限制时,就停止搜索返回结果     print(soup.find_all('a',limit=2))


      6、recursive:调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的所有子孙节点,如果只想搜索tag的直接子节点,可以使用参数 recursive=False .     print(soup.html.find_all('a'))     print(soup.html.find_all('a',recursive=False))

      7.find和find_all一样

    四.爬取小说

    import requests
    from bs4 import BeautifulSoup
    
    '''
        解析流程:
            1.pip install bs4
            2.导包:from bs4 import BeautifulSoup
            3.实例化一个BeautifulSoup对象(将页面源码数据加载到该对象中)
            4.调用BeautifulSoup对象中的相关属性和方法进行标签的定位
    '''
    
    headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
    }
    url='http://www.shicimingju.com/book/sanguoyanyi.html'
    page_text=requests.get(url=url,headers=headers).text
    
    bs4=BeautifulSoup(page_text,'lxml')
    #返回一个li列表
    li_list=bs4.select('.book-mulu>ul>li')
    f=open('./bs-三国','w',encoding='utf-8')
    for li in li_list:
        detail_url='http://www.shicimingju.com'+li.a['href']
        detail_page_text=requests.get(detail_url).text
        bs=BeautifulSoup(detail_page_text)
        title=bs.select('.www-main-container>h1')[0].text #select返回的是列表
        content=bs.find('div',class_='chapter_content').text
    
        f.write(title+'
    '+content)
        print(title+':下载成功')

     

  • 相关阅读:
    实时web应用方案——SignalR(.net core) 理论篇
    Performance Improvements in .NET Core 3.0
    在Asp.NET Core中如何管理用户机密数据
    NetCore 配置文件---直接读取及选项模式读取
    NetCore WebApi 及 搭建Swagger
    奇妙的 CSS MASK
    基于Docker安装并使用Elastic APM实现指标监控
    记录HBase手动删除Hadoop备份(archive)文件后,引发Hbase写入数据出错等一系列问题处理
    arm-linux-gcc 规定 char 为 unsigned char 导致程序运行出错
    linux下生成core dump文件方法及设置
  • 原文地址:https://www.cnblogs.com/tjp40922/p/10428447.html
Copyright © 2011-2022 走看看