zoukankan      html  css  js  c++  java
  • BeautifulSoup

    1、BeautifuSoup 是什么

    灵活又方便的网页解析库,处理高效,支持多种解析器,利用它不用编写正则表达式既可方便地实现网页信息的提取。

     安装:

      pip3 install beautifulsoup4

    用法讲解

    解析器   使用方法 优势 劣势
    python标准库 BeautifulSoup('带解析代码','html.parser') python内置标准库 容错内里差
    lxml HTML解析器 BeautilfulSoup('带解析代码','lxml') 速度快、文档容错能力强 需要安装C语言库
    lxml XML解析库  BeautifulSoup('带解析代码','xml') 速度快、唯一支持xml的解析器 需要安装C语言库
    html5lib BeautifulSout('带解析代码','html5lib') 最好的容错性、以浏览器的方式解析文档,生成html5格式的文档 速度快、不依赖外部扩展

    来个栗子

    from bs4 import BeautifulSoup
    html ="""<ul id="navList">
        <li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li>
        <li><a id="MyLinks1_SpaceLink" class="menu" href="http://ing.cnblogs.com/">闪存</a></li>
        <li><a id="blog_nav_myhome" class="menu" href="http://www.cnblogs.com/youmingkuang/">首页</a></li>
        <li><a id="blog_nav_newpost" class="menu" rel="nofollow" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a></li>
        <li><a id="blog_nav_contact" accesskey="9" class="menu" rel="nofollow" href="https://msg.cnblogs.com/send/%E5%B9%BD%E5%86%A5%E7%8B%82_%E4%B8%83">联系</a></li>
        <li><a id="blog_nav_admin" class="menu" rel="nofollow" href="https://i.cnblogs.com/">管理</a></li>
        <li><a id="blog_nav_rss" class="menu" href="http://www.cnblogs.com/youmingkuang/rss">订阅</a>
            <a id="blog_nav_rss_image" class="aHeaderXML" href="http://www.cnblogs.com/youmingkuang/rss"><img src="//www.cnblogs.com/images/xml.gif" alt="订阅" /></a></li>
    </ul>
    """
    soup = BeautifulSoup(html,'lxml')
    print(soup.prettify())  """格式化代码"""
    print(soup.li.string)

    2、标签选择器

      1、选择元素

      

    from bs4 import BeautifulSoup
    html ="""<ul id="navList">
        <title>标题</title>
        <header>大脑袋</header>
        <li name="dromouse"><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/">博客园</a></li>
        <li name="dromouse1"><a id="MyLinks1_SpaceLink" class="menu" href="http://ing.cnblogs.com/">闪存</a></li>
        <li><a id="blog_nav_myhome" class="menu" href="http://www.cnblogs.com/youmingkuang/">首页</a></li>
        <li><a id="blog_nav_newpost" class="menu" rel="nofollow" href="https://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a></li>
        <li><a id="blog_nav_contact" accesskey="9" class="menu" rel="nofollow" href="https://msg.cnblogs.com/send/%E5%B9%BD%E5%86%A5%E7%8B%82_%E4%B8%83">联系</a></li>
        <li><a id="blog_nav_admin" class="menu" rel="nofollow" href="https://i.cnblogs.com/">管理</a></li>
        <li><a id="blog_nav_rss" class="menu" href="http://www.cnblogs.com/youmingkuang/rss">订阅</a>
            <a id="blog_nav_rss_image" class="aHeaderXML" href="http://www.cnblogs.com/youmingkuang/rss"><img src="//www.cnblogs.com/images/xml.gif" alt="订阅" /></a></li>
    </ul>
    """
    soup = BeautifulSoup(html,'lxml')
    print(soup.title)
    print(soup.header)
    print(soup.li)

    输出:

    如果加了.string

    print(soup.title.string)
    print(soup.header.string)
    print(soup.li.string)

     输出就是具体的文字

    标题
    大脑袋
    博客园

     

    2、获取名称

    soup = BeautifulSoup(html,'lxml')
    print(soup.title.name)
    输出:
    title

    3、获取属性

    soup = BeautifulSoup(html,'lxml')
    print(soup.li.attrs['name'])  //第一种方式
    print(soup.li['name'])     //第二种方式
    输出:
    dromouse
    dromuser1

    4、嵌套选择

    soup = BeautifulSoup(html,'lxml')
    print(soup.li.attrs['name'])
    print(soup.ul.li.a.string)
    输出:
    博客园

    5、子节点和子孙节点

    soup = BeautifulSoup(html,'lxml')
    print(soup.li.attrs['name'])
    print(soup.ul.contents)  //输出这个标签内部的全部标签及内容
    输出:
    [' ', <title>标题</title>, ' ', <header>大脑袋</header>, '....<a class="menu" href="http://www.cnblogs.com/youmingkuang/rss" id="blog_nav_rss">订阅</a>

     第二获取子节点:迭代器

    soup = BeautifulSoup(html,'lxml')
    print(soup.ul.children)
    for i,child in enumerate(soup.ul.children):
    print(i,child)

     输出:

     

       第三 获取子节点: 子孙节点(迭代器)

    soup = BeautifulSoup(html,'lxml')
    print(soup.ul.descendants)
    for i,child in enumerate(soup.ul.descendants):
    print(i,child)
    输出:

      6、find_all
    soup = BeautifulSoup(html,'lxml')
    for ul in soup.find_all('ul'):
    print(ul.find_all('li'))
    查找出所有ul下面的li标签及其子标签
        

       7、attrs

    soup = BeautifulSoup(html,'lxml')
    print(soup.find_all(attrs={"id":"blog_nav_admin"}))
    print(soup.find_all(attrs={"class":"aHeaderXML"}))
        输出:
        

         或者

    print(soup.find_all(id="blog_nav_admin"))
    print(soup.find_all(class_="aHeaderXML")) 更加简单

      8、find 是返回单个结果。
      
     9、find_parents() 和 find_parent()

    三、CSS 选择器
      
      
    soup = BeautifulSoup(html,'lxml')

      print(soup.select('.panal .panel-heading'))

      print(soup.select('ul li'))

      print(soup.select('#list-2 .element'))

      print(soup.select('ul')[0])

     

     获取属性

    soup = BeautifulSoup(html,'lxml')
    for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])

     

     获取内容

    soup = BeautifulSoup(html,'lxml')
    for ul in soup.select('li'):
    print(ul.get_text())
    输出:

    博客园
    闪存
    首页
    新随笔
    联系
    管理
    订阅

     

     

     

     

     

     

     

     

     

     

     

     

     

     
  • 相关阅读:
    Python爬虫系列(六):搜索文档树
    Python爬虫系列(五):分析HTML结构
    Python爬虫系列(四):Beautiful Soup解析HTML之把HTML转成Python对象
    Python爬虫系列(三):requests高级耍法
    Python爬虫系列(二):requests基础
    Python爬虫系列(一):从零开始,安装环境
    Python操作rabbitmq系列(六):进行RPC调用
    Python操作rabbitmq系列(五):根据主题分配消息
    Python操作rabbitmq系列(四):根据类型订阅消息
    Django使用模板进行动态局部刷新
  • 原文地址:https://www.cnblogs.com/youmingkuang/p/7839680.html
Copyright © 2011-2022 走看看