在HTML代码中获取比较复杂的内容时,可以使用find_all()方法、find()方法,以及其他的一些方法,通过调用这些方法,并传入指定的参数,即可灵活的获取标签中内容。
一、find_all()方法
Beautiful Soup提供了一个find_all()方法,该方法可以获取所有符合条件的内容。语法格式如下:
find_all(name=None, attrs={}, recursive=True, text=None,limit=None, **kwargs)
在find_all()方法中,常用参数分别是name、attrs以及text,下面将具体介绍重要参数的用法。
- name参数
name参数用来指定标签名称,指定改参数以后将返回一个可迭代对象,所有符合条件的内容均为对象中的一个元素。代码如下:
01 from bs4 import BeautifulSoup # 导入BeautifulSoup库
02
03 # 创建模拟HTML代码的字符串
04 html_doc = """
05 <html>
06 <head>
07 <title>方法获取演示</title>
08 <meta charset="utf-8"/>
09 </head>
10 <body>
11 <p value = "1"><a href="https://item.jd.com/12353915.html">零基础学Python</a></p>
12 <p value = "2"><a href="https://item.jd.com/12451724.html">Python从入门到项目实践</a></p>
13 <p value = "3"><a href="https://item.jd.com/12512461.html">Python项目开发案例集锦</a></p>
14 <div value = "4"><a href="https://item.jd.com/12550531.html">Python编程锦囊</a></div>
15 </body>
16 </html>
17 """
18 # 创建一个BeautifulSoup对象,获取页面正文
19 soup = BeautifulSoup(html_doc, features="lxml")
20 print(soup.find_all(name='p')) # 打印名称为p的所有标签内容
21 print(type(soup.find_all(name='p'))) # 打印数据类型
程序运行结果如图所示。
说明:bs4.element.ResultSet类型的数据与python中的列表类似,如果想获取可迭代对象中的某条数据可以使用切片的方式进行获取,如获取所有p标签中的第一个元素可以参考以下代码:
print(soup.find_all(name='p')[0]) # 打印所有p标签中的第一个元素
以为bs4.element.ResultSet数据中的每一个元素都是bs4.element.Tag类型,所以可以直接对某一个元素进行嵌套获取。代码如下:
01 print(type(soup.find_all(name='p')[0])) # 打印数据类型
02 print(soup.find_all(name='p')[0].find_all(name='a')) # 打印第一个p标签内的子标签a
程序运行结果如图所示。
- attrs参数
attrs参数表示通过指定属性进行数据的获取工作,在填写attrs参数时,默认情况下需要填写字典类型的参数值,但也可以通过以赋值的方式填写参数。代码如下:
01 from bs4 import BeautifulSoup # 导入BeautifulSoup库
02
03 # 创建模拟HTML代码的字符串
04 html_doc = """
05 <html>
06 <head>
07 <title>方法获取演示</title>
08 <meta charset="utf-8"/>
09 </head>
10 <body>
11 <p value = "1"><a href="https://item.jd.com/12353915.html">零基础学Python</a></p>
12 <p value = "2"><a href="https://item.jd.com/12451724.html">Python从入门到项目实践</a></p>
13 <p value = "3"><a href="https://item.jd.com/12512461.html">Python项目开发案例集锦</a></p>
14 <div value = "4"><a href="https://item.jd.com/12550531.html">Python编程锦囊</a></div>
15 </body>
16 </html>
17 """
18 # 创建一个BeautifulSoup对象,获取页面正文
19 soup = BeautifulSoup(html_doc, features="lxml")
20 print('字典参数结果如下:')
21 print(soup.find_all(attrs={'value':'1'})) # 打印value值为1的所有内容,字典参数
22 print('赋值参数结果如下:')
23 print(soup.find_all(class_='p-1')) # 打印class为p-1的所有内容,赋值参数
24 print(soup.find_all(value='3')) # 打印value值为3的所有内容,赋值参数
程序运行结果如图所示。
- text参数
指定text参数可以获取标签中的文本,该参数可以指定字符串或者是正则表达式对象。代码如下:
25 from bs4 import BeautifulSoup # 导入BeautifulSoup库
26 import re # 导入正则表达式模块
27 # 创建模拟HTML代码的字符串
28 html_doc = """
29 <html>
30 <head>
31 <title>方法获取演示</title>
32 <meta charset="utf-8"/>
33 </head>
34 <body>
35 <p value = "1"><a href="https://item.jd.com/12353915.html">零基础学Python</a></p>
36 <p value = "2"><a href="https://item.jd.com/12451724.html">Python从入门到项目实践</a></p>
37 <p value = "3"><a href="https://item.jd.com/12512461.html">Python项目开发案例集锦</a></p>
38 <div value = "4"><a href="https://item.jd.com/12550531.html">Python编程锦囊</a></div>
39 </body>
40 </html>
41 """
42 # 创建一个BeautifulSoup对象,获取页面正文
43 soup = BeautifulSoup(html_doc, features="lxml")
44 print('指定字符串所获取的内容如下:')
45 print(soup.find_all(text='零基础学Python')) # 打印指定字符串所获取的内容
46 print('指定正则表达式对象所获取的内容如下:')
47 print(soup.find_all(text=re.compile('Python'))) # 打印指定正则表达式对象所获取的内容
程序运行结果如图所示。
二、find()方法
find_all()方法可以获取所有符合条件的标签内容,而find()方法只能获取第一个匹配的标签内容。代码如下:
01 from bs4 import BeautifulSoup # 导入BeautifulSoup库
02 import re # 导入正则表达式模块
03 # 创建模拟HTML代码的字符串
04 html_doc = """
05 <html>
06 <head>
07 <title>方法获取演示</title>
08 <meta charset="utf-8"/>
09 </head>
10 <body>
11 <p value = "1"><a href="https://item.jd.com/12353915.html">零基础学Python</a></p>
12 <p value = "2"><a href="https://item.jd.com/12451724.html">Python从入门到项目实践</a></p>
13 <p value = "3"><a href="https://item.jd.com/12512461.html">Python项目开发案例集锦</a></p>
14 <div value = "4"><a href="https://item.jd.com/12550531.html">Python编程锦囊</a></div>
15 </body>
16 </html>
17 """
18 # 创建一个BeautifulSoup对象,获取页面正文
19 soup = BeautifulSoup(html_doc, features="lxml")
20 print(soup.find(name='p')) # 打印第一个name为p的标签内容
21 print(soup.find(class_='p-3')) # 打印第一个class为p-3的标签内容
22 print(soup.find(attrs={'value':'4'})) # 打印第一个value为4的标签内容
23 print(soup.find(text=re.compile('Python'))) # 打印第一个文本中包含Python的文本信息
程序运行结果如图所示。
三、其他方法
除了以上的find_all()和find()方法可以实现按照指定条件获取标签内容以外,Beautiful Soup还提供了其他多个方法,这些方法的使用方式与find_all()和find()相同,只是查询的范围不同,各方法的具体说明如下表所示。
方法名称 | 描 述 |
find_parent() | 获取父标签内容 |
find_parents() | 获取所有祖先标签内容 |
find_next_sibling() | 获取后面第一个兄弟标签内容 |
find_next_siblings() | 获取后面所有兄弟标签内容 |
find_previous_sibling() | 获取前面第一个兄弟标签内容 |
find_previous_siblings() | 获取前面所有兄弟标签内容 |
find_next() | 获取当前标签的下一个第一个符合条件的标签内容 |
find_all_next() | 获取当前标签的下一个所有符合条件的标签内容 |
find_previous() | 获取第一个符合条件的标签内容 |
find_all_previous() | 获取所有符合条件的标签内容 |
题外话
当下这个大数据时代不掌握一门编程语言怎么跟的上脚本呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下.
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典
简历模板![在这里插入图片描述](https://img-blog.csdnimg.cn/646863996ac44da8af500c049bb72fbd.png#pic_center)
![](https://img-blog.csdnimg.cn/img_convert/535732630d0941bf52ffc67ef90306d0.png)