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

