糯麦 NurMai

400-158-5662

糯麦科技

/

新闻资讯

/

技术讨论

/

深入探索Python爬虫:BeautifulSoup解析模块

深入探索Python爬虫:BeautifulSoup解析模块

原创 新闻资讯

于 2023-09-12 08:55:45 发布

19575 浏览

在获取标签内容时,不一定都能做到一步获取指定标签中的内容,需要先确认某一个标签,然后以该标签为中心获取对应的子标签、孙标签、父标签以及兄弟标签。


下面我们来了解一下关联获取。


如何获取子标签


在获取某标签下面的所有子标签时,可以使用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下所有子标签

程序运行结果如下图所示。


1.jpg


在上图的运行结果中可以看出,通过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)                           # 打印子标签内容

程序运行结果如下图所示。


2.jpg


如何获取孙标签


在获取某标签下面所有的子孙标签时,可以使用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)                            # 打印子孙标签内容

程序运行结果如下图所示。


3.jpg


如何获取父标签


获取父标签有两种方式,一种是通过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)                  # 打印父标签及祖先标签名称

程序运行结果如下图所示。


4.jpg


从上图的运行结果中可以看出,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标签上一个兄弟标签(文本标签内容)

程序运行结果如下图所示。


5.jpg


如果想获取当前标签后面的所有兄弟标签时,可以使用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))

程序运行结果如下图所示。


6.jpg

Python

BeautifulSoup

网站开发

阅读排行

  • 1. 几行代码就能实现Html大转盘抽奖

    大转盘抽奖是网络互动营销的一种常见形式,其通过简单易懂的界面设计,让用户在游戏中体验到乐趣,同时也能增加商家与用户之间的互动。本文将详细介绍如何使用HTML,CSS和JavaScript来实现大转盘抽奖的功能。

    查看详情
  • 2. 微信支付商户申请接入流程

    微信支付,是微信向有出售物品/提供服务需求的商家提供推广销售、支付收款、经营分析的整套解决方案,包括多种支付方式,如JSAPI支付、小程序支付、APP支付H5支付等支付方式接入。

    查看详情
  • 3. 浙江省同区域公司地址变更详细流程

    提前准备好所有需要的资料,包含:房屋租赁合同、房产证、营业执照正副本、代理人身份证正反面、承诺书(由于我们公司其中一区域已有注册另外一公司,所以必须需要承诺书)

    查看详情
  • 4. 阿里云域名ICP网络备案流程

    根据《互联网信息服务管理办法》以及《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。

    查看详情
  • 5. 微信小程序申请注册流程

    微信小程序注册流程与微信公众号较为相似,同时微信小程序支持通过已认证的微信公众号进行注册申请,无需进行单独认证即可使用,同一个已认证微信公众号可同时绑定注册多个小程序。

    查看详情