You need to enable JavaScript to run this app. 如何使用BeautifulSoup提取外层span嵌套的内层span标签文本
优惠活动
大模型
产品
解决方案
定价
更多

如何使用BeautifulSoup提取外层span嵌套的内层span标签文本

代码问题定位与修正方案

你当前提取评分失败的核心问题共3处,并非单纯的嵌套层级定位问题:

1. 商品容器查找语法失效

你编写的容器筛选代码:
bed_data = soup.find_all("li", attrs={"class", "item product product-item"})
这里attrs参数内使用逗号分隔元素,属于Python集合的语法,并非字典的键值对格式,会导致BeautifulSoup无法解析筛选规则,要么触发类型报错,要么返回空列表,后续循环自然无法提取到正确的子标签内容。
正确的字典格式需要用冒号分隔属性名与属性值:

bed_data = soup.find_all("li", attrs={"class": "item product product-item"})

2. 评分标签定位后的文本提取层级错误

就算修正了容器筛选的语法,你当前的逻辑是直接对带rating-value类的外层span调用getText(),这种方式会把外层span内的所有文本节点全部抓取下来,包括标签前后的换行、空白占位、甚至其他隐藏节点的文本,无法精准获取内层嵌套span里的评分值。
正确的提取逻辑是:定位到外层rating-value的span后,再向下查找它内部嵌套的子级span标签,专门提取这个内层标签的纯文本,即可精准拿到类似"89%"的评分值。

3. 空值触发的运行时报错

你当前的代码没有对查找结果做非空判断,站点上部分无用户评分的商品不会渲染对应的评分span标签,直接对None类型的返回值调用getText(),会触发AttributeError导致整个爬虫中断。

修正后的完整核心逻辑

import requests
from bs4 import BeautifulSoup
import pandas as pd

scraped_data = []
page = requests.get('https://www.swisssense.nl/bedden')
soup = BeautifulSoup(page.content, 'html.parser')

# 修正商品容器的查找语法
bed_data = soup.find_all("li", attrs={"class": "item product product-item"})

for bed in bed_data:
    # 商品名提取,加非空判断
    name_tag = bed.find("a", class_="product-item-link")
    bed_naam = name_tag.get_text(strip=True) if name_tag else ""
    
    # 价格提取
    price_tag = bed.find("span", class_="price")
    bed_price = price_tag.get_text(strip=True) if price_tag else ""
    
    # 评分提取,逐层定位
    bed_rating = ""
    # 第一步:找外层带rating-value类的span
    rating_wrapper = bed.find("span", class_="rating-value")
    if rating_wrapper:
        # 第二步:找外层span内部嵌套的子级span
        inner_rating_tag = rating_wrapper.find("span")
        if inner_rating_tag:
            bed_rating = inner_rating_tag.get_text(strip=True)
    
    scraped_data.append(
        {"bed_naam": bed_naam, "bed_price": bed_price, "bed_rating": bed_rating}
    )

dataFrame = pd.DataFrame.from_dict(scraped_data)
dataFrame.to_csv('swisssense.csv', index=False)

补充优化提示

  • 调用get_text()时直接传入strip=True参数,会自动清除文本前后的所有空白、换行符,不需要后续手动调用.strip()处理
  • 你原代码中写的商品图片提取逻辑bed_images= bed.find("img", class_="product-image-photo").getText() 存在错误:img是自闭合空标签,自身没有文本内容,如果需要导出图片链接,应该通过属性取值的方式获取src字段值:bed.find("img", class_="product-image-photo").get("src"),再将其加入导出的字段字典即可
  • 循环遍历每个商品容器再查找内部子标签的逻辑是合理的,比全局一次性查找所有商品名、价格、评分再做索引对齐的方案更稳定,不会出现列表长度不匹配导致的字段错位问题

内容的提问来源于stack exchange,提问作者Thomas Franken

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 08:45:01