• Beautiful Soup (一)


     

    一、Beautiful Soup库的理解

    1、Beautiful Soup库可以说是对HTML进行解析、遍历、维护“标签树”的功能库

    2、pip install bs4

    3from bs4 import BeautifulSoup       #beautifulsoup4库使用时是简写的bs4

    二、Beautiful Soup类的基本元素

    1Tag——标签,最基本的信息组织单元,分别用<></>表明开头和结尾

    2Name——标签的名字,<p>...</p>的名字是'p',格式:<tag>.name

    3Attributes——标签的属性,字典形式组织,格式:<tag>.attrs

    4NavigableString——标签内非属性字符串,<>...</>中的字符串,格式:<tag>.string

    5Comment——标签内字符串的注释部分,一种特殊的Comment类型(尖括号叹号表示注释开始:<!--This is a commet-->

    三、获取标签的方法

    1soup = BeautifulSoup(demo,'html.parser')

    2soup.li.name          #a标签的名字

    wps557A.tmp 

    3soup.li.parent.name     #a标签的父标签的名字

    wps557B.tmp 

    4soup.li.parent.parent.name       #a标签的父标签的父标签名字

    wps558C.tmp 

    5t = soup.li      #获得第一个a标签

    6t.attrs         #a标签的属性

    wps558D.tmp 

     

    7、soup.li.string      #获得a标签内非属性字符串(NavigableString )注意:

    soup = BeautifulSoup(data,'lxml')

    t = soup.li.string

    print(type(t),t)

    t = soup.ol.li.string

    print(type(t),t)

    8、soup.ol.string #也可能是获得Comment标签;可通过类型进行判断

    wps558E.tmp 

     

    四、使用

    数据文件:

    data = '''<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>soup测试</title>
        <title class="warm">你那温情的一笑,搞得我瑟瑟发抖</title>
    </head>
    <body>
    <div class="tang">
        <ul>
            <li class="hello" id="world"><a href="http://www.baidu.com" title="出塞"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></li>
            <list><a href="https://www.baidu.com" title="出塞" style="font-weight: bold"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></list>
            <li><a href="http://www.163.com" class="taohua" title="huahua">人面不知何处去,桃花依旧笑春风</a></li>
            <lists class="hello"><a href="http://mi.com" id="hong" title="huahua">去年今日此门中,人面桃花相映红</a></lists>
            <li id="wo"><a href="http://qq.com" name="he" id="gu">故人西辞黄鹤楼,烟花三月下扬州</a></li>
        </ul>
        <ul>
            <li class="hello" id="sf"><a href="http://www.baidu.com" title="出塞"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></li>
            <list><a href="https://www.baidu.com" title="出塞"><!--秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山--></a></list>
            <li><a href="http://www.163.com" class="taohua">人面不知何处去,桃花依旧笑春风</a></li>
            <lists class="hello"><a href="http://mi.com" id="fhsf">去年今日此门中,人面桃花相映红,不知桃花何处去,出门依旧笑楚风</a></lists>
            <li id="fs"><a href="http://qq.com" name="he" id="gufds">故人西辞黄鹤楼,烟花三月下扬州</a></li>
        </ul>
    </div>
    <div id="meng">
        <p class="jiang">
            <span>三国猛将</span>
        <ol>
            <li>关羽</li>
            <li>张飞</li>
            <li>赵云</li>
            <li>马超</li>
            <li>黄忠</li>
        </ol>
        <div class="cao">
            <ul>
                <li>典韦</li>
                <li>许褚</li>
                <li>张辽</li>
                <li>张郃</li>
                <li>于禁</li>
                <li>夏侯惇</li>
            </ul>
        </div>
        </p>
    </div>
    </body>
    </html>'''

     

     

    1、第一类对象:BeautifulSoup

     

    wps558F.tmp 

     

    2、第二类标签 Tag,只会返回第一个标签里的所有内容

     

    wps55A0.tmp 

     

    3、第三类数据类型NavigableString

     

    wps55A1.tmp 

    4、第四种,Comment,注释

    wps55A2.tmp 

     

    5、遍历(获取子节点)

    1soup = BeautifulSoup(data,'lxml')

    t = soup.ul.children

    print(t)

    for i in t:

        print(i)

    wps55A3.tmp 

     

    2)print(soup.div.contents)# 返回一个列表

     

    wps55A4.tmp

     

    3)print(soup.div.descendants)# 返回的是一个迭代器

     

    wps55B4.tmp

     

    4print(soup.div.parents)#获取所有的祖先节点

    .parent属性是获取父节点,返回来的是整个父节点,里面包含该子节点。.parents就是获取所有的祖先节点,返回的是一个生成器

    注:>生成器是只能遍历一次的。

    >生成器是一类特殊的迭代器。

    wps55B5.tmp 

    6、bs库的更高级的用法(获取任意一个指定属性的标签)

    soup.find_all( name , attrs , recursive , text , **kwargs )

    name:需要获取的标签名

    attrs:接收一个字典,为属性的键值,或者直接用关键字参数来替代也可以,下面

    recursive:设置是否搜索直接子节点

    text:对应的字符串内容

    limit:设置搜索的数量

    1)先使用name参数来进行搜索(print(soup.find_all('li'))

    wps55B6.tmp 

     

     

    2) 使用nameattrs参数(print(soup.find_all('div', {'class':'more-meta'}))

    注:这个对上个进行了筛选,属性参数填的是一个字典类型的

     

    wps55B7.tmp 

     

    3)根据关键字参数来搜索

    print(soup.find_all(class_='cao'))

    注:因为class是python关键字,所以关键字参数时需要加多一个下划线来进行区别

     

    wps55B8.tmp 

     

    4) find()方法

    此方法与find_all()方法一样,只不过这个方法只是查找一个标签而已,后者是查找所有符合条件的标签。

    5) select()方法

    这个方法是使用css选择器来进行筛选标签的。

    css选择器:就是根据标签的名字,id和class属性来选择标签。

    通过标签名:直接写该标签名,如li a,这个就是找li标签下的a标签

    通过class属性:用. 符号加class属性值,如.title .time这个就是找class值为title下的class值为time的标签

    通过id属性:用# 加id属性值来进行查找,如#img #width这个就是找id值为img下的id值为width的标签

    上面三者可以混合使用,如ul .title #width

     

     

    6).get_text()方法和前面的.string属性有点不一样哈,这里的他会获取该标签的所有文本内容,不管有没有子标签

     

    wps55C9.tmp

     

    wps55CA.tmp 

    注:.string会把注释也打印出来,若标签没有内容,只有子标签有,就返回None

    .get_text()不打印注释,会把标签本身和子标签内容都打印出来;

     

    7)还可以用标签选择器来进行筛选元素, 返回的都是一个列表

    print(soup.select('div ul li'))# 这个是根据标签名进行筛选

    print(soup.select('.tang .taohua'))# 这个是根据class来进行筛选

    print(soup.select('#wo #gu '))# 这个是根据id来进行筛选

     

    wps55CB.tmp 

     

    8)等价标签

    t = soup('li')

    print(type(t),t)

    t = soup.find_all("li")

    print(type(t),t)

    wps55CC.tmp 

     

    t = soup.ul.find_all(text=True)

    print(type(t),t)

     

    t = soup.ul(text=True)

    print(type(t),t)

     

    soup.find_all("ul",limit=1)

    wps55CD.tmp

     

    9)soup.ul.find_all

    soup.ul.find_all(text=True) #只有内容的列表

    soup.ul.find_all() #带有li标签的列表

    soup.find_all("ul", limit=1) #带有ul li list标签的列表,limit限制返回的数量

     

    wps55DD.tmp 

     

     

     

    欢迎关注小婷儿的博客:

    csdnhttps://blog.csdn.net/u010986753

    博客园:http://www.cnblogs.com/xxtalhr/

     

    有问题请在博客下留言或加QQ群:483766429 或联系作者本人 QQ 87605025

     

    OCP培训说明连接:https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA

    OCM培训说明连接:https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA

     

    小婷儿的python正在成长中,其中还有很多不足之处,随着学习和工作的深入,会对以往的博客内容逐步改进和完善哒。

    小婷儿的python正在成长中,其中还有很多不足之处,随着学习和工作的深入,会对以往的博客内容逐步改进和完善哒。

    小婷儿的python正在成长中,其中还有很多不足之处,随着学习和工作的深入,会对以往的博客内容逐步改进和完善哒。

    重要的事说三遍。。。。。。

     

     

        wps55DE.tmp    wps55DF.tmp

     

  • 相关阅读:
    PHP+JQUEY+AJAX实现分页
    Flume知识扩展
    Flume高级之自定义MySQLSource
    Flume监控之Ganglia
    Flume 概述/企业案例
    Yarn (转自之乎者也)
    MapReduce如何解决数据倾斜?
    JVM调优
    Hive性能优化
    HBase的二级索引
  • 原文地址:https://www.cnblogs.com/pythonbao/p/9142583.html
Copyright © 2020-2023  润新知