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

