如何用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
相关产品推荐
相关产品推荐

