You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用BeautifulSoup4循环解除<a>标签父元素包裹至其父元素为<p>

如何循环解除指定a标签的父元素包裹,直到父元素为p标签?

你遇到的问题核心是调用unwrap()的对象搞错了——你之前用了a.parent.name.unwrap(),但name只是父元素的标签名字符串,根本没有unwrap()方法,得直接对父元素对象调用才行!

先看修正后的完整代码,我帮你把循环部分改对了:

import urllib3
from bs4 import BeautifulSoup as bs

http = urllib3.PoolManager()
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

page = "https://www.snopes.com/fact-check/rebuilding-iraq/"
link = "http://www.elca.org/ScriptLib/OS/Congregations/cdsDetail.asp?congrno=12962"

r = http.request('get', page)
body = r.data
soup = bs(body, 'lxml')

# 定位到目标a标签
a = soup.find('a', href=link)

# 先判断a标签是否存在,避免报错
if a:
    # 循环检查父元素,直到父元素是p标签
    while a.parent.name != "p":
        # 直接对父元素调用unwrap(),解除包裹
        a.parent.unwrap()
else:
    print("未找到目标链接对应的a标签")

print(soup)

关键说明:

  • a.parent才是真正的父元素节点对象,调用它的unwrap()方法会移除这个父标签,同时把a标签直接放到父标签原来的位置(也就是成为父标签的父元素的子节点)。
  • 每次执行unwrap()后,a的父元素会自动更新为原来父元素的父元素,所以循环会持续检查,直到父元素是<p>为止。
  • 加了if a:的判断是为了防止find()没找到目标标签时,后续代码报错,让脚本更健壮。

内容的提问来源于stack exchange,提问作者Mohamed Moustafa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:08:01