深入探索Python爬虫:BeautifulSoup解析模块
在获取标签内容时,不一定都能做到一步获取指定标签中的内容,需要先确认某一个标签,然后以该标签为中心获取对应的子标签、孙标签、父标签以及兄弟标签。
下面我们来了解一下关联获取。
如何获取子标签
在获取某标签下面的所有子标签时,可以使用contents或者是children属性来实现,其中contents所返回的是一个列表,在这个列表中每个元素都是一个子标签内容,而children所返回的则是一个“list_iterator”类型的可迭代对象。获取所有子标签的代码如下:
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 </html>
11 """
12 # 创建一个BeautifulSoup对象,获取页面正文
13 soup = BeautifulSoup(html_doc, features="lxml")
14 print(soup.head.contents) # 列表形式打印head下所有子标签
15 print(soup.head.children) # 可迭代对象形式打印head下所有子标签
程序运行结果如下图所示。
在上图的运行结果中可以看出,通过head.contents所获取的所有子标签中有三个换行符\n以及两个子标题(title与meta)对应的所有内容。head.children所获取的则是一个“list_iterator”可迭代对象,如果需要获取该对象中的所有内容,可以直接将其转换为list类型或者通过for循环遍历的方式进行获取。代码如下:
01 print(list(soup.head.children)) # 打印将可迭代对象转换为列表形式的所有子标签
02 for i in soup.head.children: # 循环遍历可迭代对象中的所有子标签
03 print(i) # 打印子标签内容
程序运行结果如下图所示。
如何获取孙标签
在获取某标签下面所有的子孙标签时,可以使用descendants属性来实现,该属性会返回一个generator对象,获取该对象中的所有内容时,同样可以直接将其转换为list类型或者通过for循环遍历的方式进行获取。这里以for循环遍历方式为例代码如下:
01 from bs4 import BeautifulSoup # 导入BeautifulSoup库
02
03 # 创建模拟HTML代码的字符串
04 html_doc = """
05 <html>
06 …此处省略…
07 <body>
08 <div id="test1">
09 <div id="test2">
10 <ul>
11 <li value = "user1234">
12 此处为演示信息
13 </li>
14 </ul>
15 </div>
16 </div>
17 </body>
18 </html>
19 """
20 # 创建一个BeautifulSoup对象,获取页面正文
21 soup = BeautifulSoup(html_doc, features="lxml")
22 print(soup.body.descendants) # 打印body标签下所有子孙标签内容的generator对象
23 for i in soup.body.descendants: # 循环遍历generator对象中的所有子孙标签
24 print(i) # 打印子孙标签内容
程序运行结果如下图所示。
如何获取父标签
获取父标签有两种方式,一种是通过parent属性直接获取指定标签的父标签内容,还可以通过parents属性获取指定标签的父标签及以上(祖先标签)内容,只是parents属性会返回一个generator对象,获取该对象中的所有内容时,同样可以直接将其转换为list类型或者通过for循环遍历的方式进行获取。这里以for循环遍历方式为例,获取父标签及祖先标签内容。代码如下:
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 </html>
11 """
12 # 创建一个BeautifulSoup对象,获取页面正文
13 soup = BeautifulSoup(html_doc, features="lxml")
14 print(soup.title.parent) # 打印title标签的父标签内容
15 print(soup.title.parents) # 打印title标签的父标签及以上内容的generator对象
16 for i in soup.title.parents: # 循环遍历generator对象中的所有父标签及以上内容
17 print(i.name) # 打印父标签及祖先标签名称
程序运行结果如下图所示。
从上图的运行结果中可以看出,parents属性所获取父标签的顺序为head、html,最后的[document]表示文档对象,是整个HTML文档,也是BeautifulSoup对象。
如何获取兄弟标签
兄弟标签也就是同级标签,表示在同一级标签内的所有子标签间的关系。假如在一段HTML代码中获取第一个p标签的下一个div兄弟标签时,可以使用next_sibling属性,如果想获取当前div标签的上一个兄弟标签p时,可以使用previous_sibling属性。通过这两个属性获取兄弟标签时,如果两个标签之间含有换行符(\n)、空字符或者是其他文本内容时,将返回这些文本标签。代码如下:
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标签下文本
13 <div value = "2"><a href="https://item.jd.com/12451724.html">Python从入门到项目实践</a></div>
14 <p value = "3"><a href="https://item.jd.com/12512461.html">Python项目开发案例集锦</a></p>
15 <div value = "4"><a href="https://item.jd.com/12550531.html">Python编程锦囊</a></div>
16 </body>
17 </html>
18 """
19 # 创建一个BeautifulSoup对象,获取页面正文
20 soup = BeautifulSoup(html_doc, features="lxml")
21 print(soup.p.next_sibling) # 打印第一个p标签下一个兄弟标签(文本标签内容)
22 print(list(soup.p.next_sibling)) # 以列表形式打印文本标签中的所有元素
23 div = soup.p.next_sibling.next_sibling # 获取p标签同级的第一个div标签
24 print(div) # 打印第一个div标签内容
25 print(div.previous_sibling) # 打印第一个div标签上一个兄弟标签(文本标签内容)
程序运行结果如下图所示。
如果想获取当前标签后面的所有兄弟标签时,可以使用next_siblings属性。如果想获取当前标签前面的所有兄弟标签时,可以使用previous_siblings属性。通过这两个属性所获取的标签都将以generator(可迭代对象)的形式返回,在获取标签内容时,同样可以直接将其转换为list类型或者通过for循环遍历的方式进行获取。这里以转换list类型为例代码如下:
01 print('获取p标签后面的所有兄弟标签如下:\n',list(soup.p.next_siblings))
02 print('获取p标签前面的所有兄弟标签如下:\n',list(soup.p.previous_siblings))
程序运行结果如下图所示。
Python
BeautifulSoup
网站开发
阅读排行
-
1. 微信支付商户申请接入流程
微信支付,是微信向有出售物品/提供服务需求的商家提供推广销售、支付收款、经营分析的整套解决方案,包括多种支付方式,如JSAPI支付、小程序支付、APP支付H5支付等支付方式接入。
查看详情 -
2. 微信小程序申请注册流程
微信小程序注册流程与微信公众号较为相似,同时微信小程序支持通过已认证的微信公众号进行注册申请,无需进行单独认证即可使用,同一个已认证微信公众号可同时绑定注册多个小程序。
查看详情 -
3. 阿里云域名ICP网络备案流程
根据《互联网信息服务管理办法》以及《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。
查看详情 -
4. 浙江省同区域公司地址变更详细流程
提前准备好所有需要的资料,包含:房屋租赁合同、房产证、营业执照正副本、代理人身份证正反面、承诺书(由于我们公司其中一区域已有注册另外一公司,所以必须需要承诺书)
查看详情 -
5. 几行代码就能实现Html大转盘抽奖
大转盘抽奖是网络互动营销的一种常见形式,其通过简单易懂的界面设计,让用户在游戏中体验到乐趣,同时也能增加商家与用户之间的互动。本文将详细介绍如何使用HTML,CSS和JavaScript来实现大转盘抽奖的功能。
查看详情