深入探索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. 几行代码就能实现Html大转盘抽奖
大转盘抽奖是网络互动营销的一种常见形式,其通过简单易懂的界面设计,让用户在游戏中体验到乐趣,同时也能增加商家与用户之间的互动。本文将详细介绍如何使用HTML,CSS和JavaScript来实现大转盘抽奖的功能。
查看详情 -
2. 浙江省同区域公司地址变更详细流程
提前准备好所有需要的资料,包含:房屋租赁合同、房产证、营业执照正副本、代理人身份证正反面、承诺书(由于我们公司其中一区域已有注册另外一公司,所以必须需要承诺书)
查看详情 -
3. 微信支付商户申请接入流程
微信支付,是微信向有出售物品/提供服务需求的商家提供推广销售、支付收款、经营分析的整套解决方案,包括多种支付方式,如JSAPI支付、小程序支付、APP支付H5支付等支付方式接入。
查看详情 -
4. 阿里云域名ICP网络备案流程
根据《互联网信息服务管理办法》以及《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。
查看详情 -
5. 微信小程序申请注册流程
微信小程序注册流程与微信公众号较为相似,同时微信小程序支持通过已认证的微信公众号进行注册申请,无需进行单独认证即可使用,同一个已认证微信公众号可同时绑定注册多个小程序。
查看详情