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

如何用BeautifulSoup 4抓取Script标签中的商品价格?

解决Digikala商品价格抓取问题

问题原因

Digikala采用React框架渲染页面,初始请求返回的HTML中<div id="__next">是空的,实际页面内容由JavaScript动态生成。商品价格数据并非直接嵌入DOM,而是存储在页面的<script>标签内的JSON结构中,所以直接用BeautifulSoup解析初始HTML无法获取到价格。


解决方案1:解析页面内的JSON数据(轻量推荐)

直接提取页面中存储商品初始数据的<script>标签,解析其中的JSON内容获取价格:

from bs4 import BeautifulSoup
import requests
import json

url = "https://www.digikala.com/product/dkp-722339/%DA%A9%D8%AA%D8%A7%D8%A8-%D9%85%D8%BA%D8%A7%D8%B2%D9%87-%D8%AE%D9%88%D8%AF%DA%A9%D8%B4%DB%8C-%D8%A7%D8%AB%D8%B1-%DA%98%D8%A7%D9%86-%D8%AA%D9%88%D9%84%DB%8C/"

r = requests.get(url)
soup = BeautifulSoup(r.content, "html.parser")

# 定位包含商品初始数据的script标签
script_tag = soup.find("script", string=lambda t: t and "__initialData__" in t)
if script_tag:
    # 提取并格式化JSON字符串
    raw_json = script_tag.string.split("window.__initialData__ = ")[1].rstrip(";")
    product_data = json.loads(raw_json)
    # 从JSON结构中提取售价(字段路径可能随网站更新变化,需验证)
    selling_price = product_data["product"]["pricing"]["sellingPrice"]
    print(f"商品售价:{selling_price} 伊朗里亚尔")
else:
    print("未找到存储商品数据的script标签")
  • 无需模拟浏览器,请求速度快
  • 若网站更新了数据存储的变量名(比如__initialData__变更),需要调整代码中的匹配关键词

解决方案2:用Selenium模拟浏览器渲染(稳定兼容)

如果网站的JSON数据结构频繁变化,可使用Selenium模拟完整浏览器加载,直接获取渲染后的DOM元素:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 初始化浏览器驱动(需提前安装对应浏览器的driver,比如ChromeDriver)
driver = webdriver.Chrome()
driver.get(url)
time.sleep(2)  # 等待页面JS加载完成

# 通过CSS选择器定位价格元素(选择器需根据页面实际结构调整)
price_element = driver.find_element(By.CSS_SELECTOR, ".c-product-price__value")
print(f"商品售价:{price_element.text}")

driver.quit()
  • 需要安装Selenium和对应浏览器的驱动程序
  • 速度较慢,但能适配JS动态渲染的复杂场景

内容的提问来源于stack exchange,提问作者MohammadAli Mazaheri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:40:24