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

BeautifulSoup跨站点提取div内span值返回空问题

问题排查结果

代码返回空值由以下几个常见原因导致:

  • 逻辑写漏:循环内仅将提取结果赋值给price变量,初始化的output全程没有被写入任何值,最后输出output必然为空。
  • 静态爬取拿不到渲染后内容:第二个站点的DOM带data-v-前缀的自定义属性,是Vue框架客户端渲染的页面。如果直接用requests发起请求拿到原始响应,页面里的product-features区块初始只有Vue的占位注释<!---->,包含bought 53 times的span节点是浏览器执行JS后才插入DOM的,静态爬取根本获取不到这个节点,此时containers要么是空列表,要么遍历后找不到目标span,最终得到空值。
  • 解析器兼容问题:如果确认拿到了完整的渲染后HTML,大概率是Python内置的html.parser解析器容错性差,遇到不规范的HTML时DOM树解析错位,匹配不到目标节点。
修复方案

已获取完整渲染HTML的场景(如Selenium/Playwright抓取的page_source)

补全赋值逻辑,建议换用容错性更好的lxml解析器,参考代码如下:

# 初始化BeautifulSoup时指定lxml解析器,需提前执行pip install lxml安装
page_soup = BeautifulSoup(html_content, "lxml")
containers = page_soup.find_all("div", {"class": "product-features"})
output = ""
for container in containers:
    count_tag = container.find("span", {"class": "sold_products_count"})
    if count_tag:
        # 提取文本后先去除首尾换行、空格,再替换逗号
        output = count_tag.text.strip().replace(",", "")
        # 找到目标值即可终止循环,无需多余遍历
        break

print(output)

运行后即可得到目标值 bought 53 times。

静态requests请求的场景

直接请求拿不到JS渲染的内容,二选一处理即可:

  • 换用支持JS渲染的爬取工具:比如Playwright、Selenium,等待页面加载完成、DOM渲染结束后再提取页面源码做解析,通用性强,不需要额外逆向站点逻辑。
  • 逆向接口:打开浏览器开发者工具的网络面板,筛选XHR/fetch请求,找到返回商品数据的接口,直接请求接口拿结构化的JSON数据,这种方式爬取效率最高,不需要解析HTML。

注:原代码中存储销量的变量命名为price,变量名和实际存储内容不匹配,建议后续调整为有实际含义的命名,避免后续逻辑写错。

内容的提问来源于stack exchange,提问作者Matthew John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:18:21