ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Beautiful Soup (一)

2021-04-18 16:57:22  阅读:160  来源: 互联网

标签:Beautiful soup 标签 li Soup print find ul


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=       

    今天小婷儿给大家分享的是Beautiful Soup (一)。


Beautiful Soup (一)          


 

一、Beautiful Soup库的理解

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

2、pip install bs4

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

 

二、Beautiful Soup类的基本元素

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

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

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

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

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

 

三、获取标签的方法

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

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

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

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

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

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

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

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

6、t.attrs         #a标签的属性

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


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标签;可通过类型进行判断

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


 

四、使用

 

数据文件:

data = '''<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>soup测试</title>
    <title>你那温情的一笑,搞得我瑟瑟发抖</title>
</head>
<body>
<div>
    <ul>
        <li 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" title="huahua">人面不知何处去,桃花依旧笑春风</a></li>
        <lists><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 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">人面不知何处去,桃花依旧笑春风</a></li>
        <lists><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>
        <span>三国猛将</span>
    <ol>
        <li>关羽</li>
        <li>张飞</li>
        <li>赵云</li>
        <li>马超</li>
        <li>黄忠</li>
    </ol>
    <div>
        <ul>
            <li>典韦</li>
            <li>许褚</li>
            <li>张辽</li>
            <li>张郃</li>
            <li>于禁</li>
            <li>夏侯惇</li>
        </ul>
    </div>
    </p>
</div>
</body>
</html>'''



 

1、第一类对象:BeautifulSoup


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


 

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


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


 

3、第三类数据类型NavigableString


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

4、第四种,Comment,注释

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


 

5、遍历(获取子节点)

 

1)soup = BeautifulSoup(data,'lxml')

t = soup.ul.children

print(t)

for i in t:

    print(i)

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


 

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

 

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


 

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

 

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


 

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

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

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

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

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

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

 

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

name:需要获取的标签名

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

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

text:对应的字符串内容

limit:设置搜索的数量

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

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=



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

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

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


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

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

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

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


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属性有点不一样哈,这里的他会获取该标签的所有文本内容,不管有没有子标签

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

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

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

 

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

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

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

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

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


8)等价标签

t = soup('li')

print(type(t),t)

t = soup.find_all("li")

print(type(t),t)

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


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)

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


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限制返回的数量

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=




标签:Beautiful,soup,标签,li,Soup,print,find,ul
来源: https://blog.51cto.com/lhrbest/2715792

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有