当前位置: 首页 > 工具软件 > BeautifulSoup > 使用案例 >

beautifulsoup详解

程俊力
2023-12-01

目录

一.标签选择器

1.获取文本内容 .string

2.获取标签名称  .name

3.获取属性的值

二.嵌套

1.子节点与子孙节点

1.获取子节点

2.获取子孙节点,  .descendants返回一个生成器

2.父节点与祖先节点

1. 获取父节点

3.兄弟节点

标准选择器

1.使用find_all()根据标签名查找

1.get_text() 获取内容  

2.string获取文字信息

2.使用find_all根据属性查找

3.text=()根据文本值选择

3.find查找只返回单个元素

三:css选择器


一.标签选择器

1.获取文本内容 .string

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<p class='next'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''
# 1,导包
from bs4 import BeautifulSoup 
#,2,实例化对象
soup = BeautifulSoup(html, 'lxml')  # 参数1:要解析的内容  参数2:解析器

# print(soup.prettify())  # 代码补全

# 通过标签选取,会返回包含标签本身及其里面的所有内容
print(soup.head) # 包含head标签在内的所有内容
print(soup.p) # 返回匹配的第一个结果

# .string是属性,作用是获取字符串文本
print(soup.html.head.title.string)
print(soup.title.string)


'''
<head>
<title>The Dormouse's story</title>
</head>
<p class="next">text</p>
The Dormouse's story
The Dormouse's story
'''

2.获取标签名称  .name

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<p class='next'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>'''
from bs4 import BeautifulSoup

soup = BeautifulSoup(html, 'lxml')

print(soup.title.name)  # 结果为标签本身名称  --> title
print(soup.p.name)  # --> 获取标签名

'''
title
p
'''

3.获取属性的值

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<a href='/dhj'></a>
<p class='next' name=123 id='money'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''
# 1,导包
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

print(soup.p.attrs['name'])# 获取p标签name属性的属性值
print(soup.a.attrs['href']) # 获取p标签id属性的属性值

print(soup.p['id']) #第二种写法
print(soup.p['class']) # 以列表得形式保存
print(soup.a['href'])  # 也是只返回第一个值



'''
123
/dhj
money
['next']
/dhj
'''

二.嵌套

1.子节点与子孙节点

1.获取子节点

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<a href='/dhj'></a>
<p class='next' name=123 id='money'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

# 标签选择器只能拿到部分内容 ,不能拿到所有,那如何解决??
# print(soup.p.a)

# .contents属性可以将标签的子节点以列表的形式输出
# print(soup.ul.contents)  # a是p的子节点,获取P标签所有子节点内容 返回一个list

for i in soup.ul.contents:
    print(i)

'''
<li class="navitem-index current active"><a href="/">首页</a></li>
<li><a href="/guonei">国内</a></li>
<li><a href="/guoji">国际</a></li>
<li><a href="/mil">军事</a></li>
<li><a href="/finance">财经</a></li>
<li><a href="/ent">娱乐</a></li>
<li><a href="/sports">体育</a></li>
<li><a href="/internet">互联网</a></li>
<li><a href="/tech">科技</a></li>
<li><a href="/game">游戏</a></li>
<li><a href="/lady">女人</a></li>
<li><a href="/auto">汽车</a></li>
<li><a href="/house">房产</a></li>
'''

2.获取子孙节点,  .descendants返回一个生成器

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<a href='/dhj'></a>
<p class='next' name=123 id='money'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''


from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.p.descendants)  # 获取子孙节点  生成器本身是一种特殊的迭代器

'''
<generator object Tag.descendants at 0x000001C2B238C0C8>
'''

# enumerate() 函数用于将一个可遍历的数据对象添加一个索引序列
# 同时列出数据和数据下标值,一般用在 for 循环当中
for i,child in enumerate(soup.body.descendants):
    print(i,child)
'''
0 
1 <div class="menu-list">
<a href="/dhj"></a>
<p class="next" id="money" name="123">text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li><a href="/guonei">国内</a></li>
<li><a href="/guoji">国际</a></li>
<li><a href="/mil">军事</a></li>
<li><a href="/finance">财经</a></li>
<li><a href="/ent">娱乐</a></li>
<li><a href="/sports">体育</a></li>
<li><a href="/internet">互联网</a></li>
<li><a href="/tech">科技</a></li>
<li><a href="/game">游戏</a></li>
<li><a href="/lady">女人</a></li>
<li><a href="/auto">汽车</a></li>
<li><a href="/house">房产</a></li>
</ul>
</div>
2 

3 <a href="/dhj"></a>
4 

5 <p class="next" id="money" name="123">text</p>
6 text
7 

8 <ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li><a href="/guonei">国内</a></li>
<li><a href="/guoji">国际</a></li>
<li><a href="/mil">军事</a></li>
<li><a href="/finance">财经</a></li>
<li><a href="/ent">娱乐</a></li>
<li><a href="/sports">体育</a></li>
<li><a href="/internet">互联网</a></li>
<li><a href="/tech">科技</a></li>
<li><a href="/game">游戏</a></li>
<li><a href="/lady">女人</a></li>
<li><a href="/auto">汽车</a></li>
<li><a href="/house">房产</a></li>
</ul>
9 

10 <li class="navitem-index current active"><a href="/">首页</a></li>
11 <a href="/">首页</a>
12 首页
13 

14 <li><a href="/guonei">国内</a></li>
15 <a href="/guonei">国内</a>
16 国内
17 

18 <li><a href="/guoji">国际</a></li>
19 <a href="/guoji">国际</a>
20 国际
21 

22 <li><a href="/mil">军事</a></li>
23 <a href="/mil">军事</a>
24 军事
25 

26 <li><a href="/finance">财经</a></li>
27 <a href="/finance">财经</a>
28 财经
29 

30 <li><a href="/ent">娱乐</a></li>
31 <a href="/ent">娱乐</a>
32 娱乐
33 
34 <li><a href="/sports">体育</a></li>
35 <a href="/sports">体育</a>
36 体育
37 
38 <li><a href="/internet">互联网</a></li>
39 <a href="/internet">互联网</a>
40 互联网
41 
42 <li><a href="/tech">科技</a></li>
43 <a href="/tech">科技</a>
44 科技
45 
46 <li><a href="/game">游戏</a></li>
47 <a href="/game">游戏</a>
48 游戏
49 
50 <li><a href="/lady">女人</a></li>
51 <a href="/lady">女人</a>
52 女人
53 
54 <li><a href="/auto">汽车</a></li>
55 <a href="/auto">汽车</a>
56 汽车
57 
58 <li><a href="/house">房产</a></li>
59 <a href="/house">房产</a>
60 房产
61 
62 
63 
'''

2.父节点与祖先节点

1. 获取父节点

1..parent会把自己和父节点一同打印下来

2. .parents获取祖先节点返回生成器

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<a href='/dhj'></a>
<p class='next' name=123 id='money'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.a.parents)  # parent获取父节点
print(soup.li.parent)  # parent获取父节点

'''
<generator object PageElement.parents at 0x0000021B8FBDB1C8>

<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li><a href="/guonei">国内</a></li>
<li><a href="/guoji">国际</a></li>
<li><a href="/mil">军事</a></li>
<li><a href="/finance">财经</a></li>
<li><a href="/ent">娱乐</a></li>
<li><a href="/sports">体育</a></li>
<li><a href="/internet">互联网</a></li>
<li><a href="/tech">科技</a></li>
<li><a href="/game">游戏</a></li>
<li><a href="/lady">女人</a></li>
<li><a href="/auto">汽车</a></li>
<li><a href="/house">房产</a></li>
</ul>
'''

3.兄弟节点

.next_siblings 获取后面的兄弟节点

.previous_siblings 获取前面的兄弟节点

两者返回的都是一个生成器对象

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<a href='/dhj'></a>
<p class='next' name=123 id='money'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.a.next_siblings)
for i in soup.a.next_siblings:
    print(i)# parent获取父节点
print(soup.li.previous_siblings)  # parent获取父节点
for i in soup.li.previous_siblings:
    print(i)

'''
<generator object PageElement.next_siblings at 0x000001E0B599C148>


<p class="next" id="money" name="123">text</p>


<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li><a href="/guonei">国内</a></li>
<li><a href="/guoji">国际</a></li>
<li><a href="/mil">军事</a></li>
<li><a href="/finance">财经</a></li>
<li><a href="/ent">娱乐</a></li>
<li><a href="/sports">体育</a></li>
<li><a href="/internet">互联网</a></li>
<li><a href="/tech">科技</a></li>
<li><a href="/game">游戏</a></li>
<li><a href="/lady">女人</a></li>
<li><a href="/auto">汽车</a></li>
<li><a href="/house">房产</a></li>
</ul>


<generator object PageElement.previous_siblings at 0x000001E0B599C148>
'''

标准选择器

1.使用find_all()根据标签名查找

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<a href='/dhj'></a>
<p class='next' name=123 id='money'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all('li'))

'''
[<li class="navitem-index current active"><a href="/">首页</a></li>, <li><a href="/guonei">国内</a></li>, <li><a href="/guoji">国际</a></li>, <li><a href="/mil">军事</a></li>, <li><a href="/finance">财经</a></li>, <li><a href="/ent">娱乐</a></li>, <li><a href="/sports">体育</a></li>, <li><a href="/internet">互联网</a></li>, <li><a href="/tech">科技</a></li>, <li><a href="/game">游戏</a></li>, <li><a href="/lady">女人</a></li>, <li><a href="/auto">汽车</a></li>, <li><a href="/house">房产</a></li>]
'''

1.get_text() 获取内容  

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<a href='/dhj'></a>
<p class='next' name=123 id='money'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
n = soup.find_all('li')
for i in n:
    print(i.get_text())
'''
首页
国内
国际
军事
财经
娱乐
体育
互联网
科技
游戏
女人
汽车
房产
'''

2.string获取文字信息

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<a href='/dhj'></a>
<p class='next' name=123 id='money'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
n = soup.find_all('li')
for i in n:
    print(i.string)

'''
首页
国内
国际
军事
财经
娱乐
体育
互联网
科技
游戏
女人
汽车
房产
'''

2.使用find_all根据属性查找

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<a href='/dhj'></a>
<p class='next' name=123 id='money'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
# 特殊属性查找
# print(soup.find_all(class='element'))  #  注意:错误案例
# a = soup.find_all(class_='element')  # class属于Python关键字,做特殊处理 _
# print(a)


# 推荐的查找方法!!!   --- 指定标签和属性
print(soup.find_all('div',{'class':'menu-list'}))
# # print('----'*10)
print(soup.find_all('p',{'name':'123'}))

'''
[<div class="menu-list">
<a href="/dhj"></a>
<p class="next" id="money" name="123">text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li><a href="/guonei">国内</a></li>
<li><a href="/guoji">国际</a></li>
<li><a href="/mil">军事</a></li>
<li><a href="/finance">财经</a></li>
<li><a href="/ent">娱乐</a></li>
<li><a href="/sports">体育</a></li>
<li><a href="/internet">互联网</a></li>
<li><a href="/tech">科技</a></li>
<li><a href="/game">游戏</a></li>
<li><a href="/lady">女人</a></li>
<li><a href="/auto">汽车</a></li>
<li><a href="/house">房产</a></li>
</ul>
</div>]

[<p class="next" id="money" name="123">text</p>]
'''

3.text=()根据文本值选择

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<a href='/dhj'></a>
<p class='next' name=123 id='money'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

print(soup.find_all(text='汽车'))

'''
['汽车']
'''

3.find查找只返回单个元素

html = '''
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
<body>
<div class="menu-list">
<a href='/dhj'></a>
<p class='next' name=123 id='money'>text</p>
<ul class="clearfix">
<li class="navitem-index current active"><a href="/">首页</a></li>
<li ><a href="/guonei">国内</a></li>
<li ><a href="/guoji">国际</a></li>
<li ><a href="/mil">军事</a></li>
<li ><a href="/finance">财经</a></li>
<li ><a href="/ent">娱乐</a></li>
<li ><a href="/sports">体育</a></li>
<li ><a href="/internet">互联网</a></li>
<li ><a href="/tech">科技</a></li>
<li ><a href="/game">游戏</a></li>
<li ><a href="/lady">女人</a></li>
<li ><a href="/auto">汽车</a></li>
<li ><a href="/house">房产</a></li>
</ul>
</div>
</body>
'''

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')

print(soup.find('li'))

'''
<li class="navitem-index current active"><a href="/">首页</a></li>
'''

三:css选择器

    1,类别选择器 -- class

    2,标签选择器 -- <p></p>

    3,ID选择器  -- id

详情了解:https://baike.baidu.com/item/css%E9%80%89%E6%8B%A9%E5%99%A8/2819686?fr=aladdin

注意:

    1,用CSS选择器时,标签名不加任何修饰,class类名前加. , id名前加#

   

    2,用到的方法是soup.select(),返回类型是list

   

    3,多个过滤条件需要用空格隔开,严格遵守从前往后逐层筛选

 类似资料: