BeautifulSoup如何移除span标签但保留标签内文本内容
问题根源
你当前遍历商品名称、价格标签的写法会逐个迭代标签内的子节点:当<p class="product-card__name">内部嵌套<span>子标签时,迭代过程会直接把span标签对象存入结果数组,打印时就会连带标签源码一起输出,而非只保留文本内容。
修复方案
不需要手动遍历标签子节点,直接调用BeautifulSoup内置的文本提取方法,即可自动过滤所有内部HTML标签、合并所有层级的文本内容。
核心修改是替换原来遍历name、price的循环逻辑,改用.get_text()方法提取纯文本:
import requests from bs4 import BeautifulSoup baseUrl = 'https://www.thewhiskyexchange.com/' headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36' } productLinks = [] productNameArray = [] productPriceArray = [] for x in range(1, 6): # 修复原代码url中pg参数后多余的点,补全headers传入 r = requests.get(f'https://www.thewhiskyexchange.com/c/639/bourbon-whiskey?pg={x}', headers=headers) soup = BeautifulSoup(r.content, 'lxml') productList = soup.find_all('li', class_='product-grid__item') for item in productList: # 提取商品链接 for link in item.find_all('a', href=True): productLinks.append(baseUrl + link['href']) # 直接提取名称下所有纯文本,自动过滤内部span标签 product_name = item.find('p', class_='product-card__name').get_text(strip=True) productNameArray.append(product_name) # 价格同理提取纯文本 product_price = item.find('p', class_='product-card__price').get_text(strip=True) productPriceArray.append(product_price) for x in range(len(productLinks)): print('name = ', productNameArray[x], 'price = ', productPriceArray[x], 'link = ', productLinks[x]) print('number of products', len(productLinks))
方法说明
get_text(strip=True)会提取当前选中标签下所有层级的文本内容,无论内部嵌套了span、strong等多少层子标签,都会自动剥离标签本身,只保留文字内容- 参数
strip=True会自动去除文本首尾的空格、换行符,避免输出结果带多余空白 - 同步修复了原代码的两个隐患:一是请求分页url时pg参数后多余的
.,会导致请求参数错误;二是补全了requests请求的headers参数传入,原代码定义了headers但没有在get请求里使用,容易被网站反爬拦截
注:拼接链接时如果介意出现双斜杠,可以用
urllib.parse.urljoin(baseUrl, link['href'])替代字符串直接拼接,格式会更规范。
内容的提问来源于stack exchange,提问作者Chunky Panda
相关产品推荐
相关产品推荐

