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

Selenium与BeautifulSoup无法读取目标页面XPath及JSON标签数据求助

解决方案:抓取动态加载的JSON产品数据

这个网站属于单页应用(SPA),产品数据是通过JavaScript动态渲染到页面body中的,你之前的问题根源有两个:一是没有等待页面完全加载就执行抓取操作,二是定位的外层容器并非存储JSON数据的实际载体标签。

以下是修正后的实现步骤和代码:

1. 用Selenium等待动态内容加载

直接调用find_element会在页面初始静态内容加载完成后立即执行,此时body内的产品JSON数据还没渲染出来,必须用显式等待确保目标元素加载完成。

2. 定位body内的JSON存储标签

电商网站通常会把产品数据放在<script type="application/json">标签里,直接定位这类标签才能拿到有效数据。

完整Selenium代码示例

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import json

# 初始化Chrome浏览器(需确保ChromeDriver路径配置正确)
driver = webdriver.Chrome()
driver.get("https://www.easy.com.ar/banos-y-cocinas")

# 显式等待10秒,直到body内的JSON标签加载完成
wait = WebDriverWait(driver, 10)
json_script_elements = wait.until(
    EC.presence_of_all_elements_located(
        (By.XPATH, "//body//script[@type='application/json']")
    )
)

# 遍历所有JSON标签,提取产品和价格数据
for script_elem in json_script_elements:
    try:
        # 获取标签内的JSON文本并解析
        raw_json = script_elem.get_attribute("innerHTML")
        product_data = json.loads(raw_json)
        
        # 根据实际JSON结构筛选数据(示例:查找包含products/items的字段)
        if "products" in product_data:
            for product in product_data["products"]:
                product_name = product.get("name", "未知名称")
                product_price = product.get("price", "未知价格")
                print(f"产品:{product_name} | 价格:{product_price}")
        elif "items" in product_data:
            # 若数据存在items字段,同理处理
            pass
    except json.JSONDecodeError:
        # 跳过无效的JSON标签
        continue

# 关闭浏览器
driver.quit()

3. 配合BeautifulSoup的实现方式

如果偏好用BeautifulSoup解析,需要先通过Selenium获取渲染后的完整页面源码(因为BeautifulSoup无法执行JavaScript,直接请求URL只能拿到静态初始内容):

# 在Selenium获取页面并等待加载完成后
from bs4 import BeautifulSoup

# 获取渲染后的页面源码
page_source = driver.page_source
soup = BeautifulSoup(page_source, "html.parser")

# 筛选body内的JSON标签
json_scripts = soup.select("body script[type='application/json']")
for script in json_scripts:
    try:
        product_data = json.loads(script.string)
        # 处理产品数据...
    except json.JSONDecodeError:
        pass

关键注意点

  • 显式等待的超时时间可根据网络情况调整(比如15秒)
  • 不同页面的JSON结构可能不同,需要先打印product_data查看实际字段,再调整提取逻辑
  • 若遇到反爬机制,可能需要添加请求头、设置浏览器窗口大小或使用无头模式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:33:37