• 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())
    输出:

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

     

     

     

     

     

     

     

     

     

     

     

     

     

     
  • 相关阅读:
    开启nginx缓存
    xsl输出html代码 非闭合
    记一次网络波动导致druid连接池无法创建新连接的BUG
    mysql时间操作
    JVM知识点精华汇总
    java 基础 ---HashMap、HashTable
    java面试--小谈如何面试
    Spring框架
    JAVA+微信支付APP开发+支付宝支付APP开发
    消息队列
  • 原文地址:https://www.cnblogs.com/youmingkuang/p/7839680.html
Copyright © 2020-2023  润新知