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

使用BeautifulSoup4解析dryscrape获取的HTML时出现混乱的问题求助

解决Mercadona产品页爬取问题的思路

先把你给出的代码补全并格式化,方便咱们排查问题:

from bs4 import BeautifulSoup
import dryscrape

productUrl = "https://www.mercadona.es/detall_producte.php?id=32009"
session = dryscrape.Session()
session.visit(productUrl)
response = session.body()
soup = BeautifulSoup(response, "lxml")
# 你写到container1 = so...,应该是想提取某个容器的内容吧?

接下来咱们一步步拆解可能的问题和解决方案:

1. 先确认dryscrape是否拿到了完整页面

dryscrape基于webkit,但它的维护状态已经很久没更新了,经常会出现加载不完整的情况。你可以先把获取到的HTML存到本地,看看是不是真的包含你需要的产品信息:

with open("mercadona_page.html", "w", encoding="utf-8") as f:
    f.write(response)

打开这个文件检查,如果内容不全,试试给页面加个加载等待:

session.visit(productUrl)
# 等待1秒让页面资源加载(可根据实际情况调整时长)
session.wait(1)
response = session.body()

2. 先试试直接请求,说不定根本不需要JS渲染

你提到页面实际没用到JS,那大概率网站的“需启用JS”提示只是个反爬幌子。试试用requests直接请求,记得带上浏览器的User-Agent(很多网站会拦截无UA的请求):

import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
}
productUrl = "https://www.mercadona.es/detall_producte.php?id=32009"

response = requests.get(productUrl, headers=headers)
soup = BeautifulSoup(response.text, "lxml")

# 先尝试提取产品名称测试
product_name = soup.find("h1")
print(product_name.text.strip() if product_name else "没找到产品名称")

如果直接请求能拿到内容,那完全没必要用dryscrape,速度还快很多。

3. 真需要JS渲染?换个更稳定的工具

dryscrape已经停更多年,兼容性很差。推荐用playwright或者selenium,这两个是目前JS渲染爬取的主流工具,稳定性拉满:

Playwright示例(更推荐,API更简洁)

先安装依赖:pip install playwright,然后运行playwright install安装浏览器驱动。

from playwright.sync_api import sync_playwright
from bs4 import BeautifulSoup

productUrl = "https://www.mercadona.es/detall_producte.php?id=32009"

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)  # 改成False可以看到浏览器窗口,方便调试
    page = browser.new_page(user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36")
    page.goto(productUrl)
    # 等待产品标题加载完成,避免异步加载导致内容缺失
    page.wait_for_selector("h1")
    response = page.content()
    browser.close()

soup = BeautifulSoup(response, "lxml")
product_name = soup.find("h1").text.strip()
print(product_name)

4. 别忘了网站的反爬机制

Mercadona作为大型电商,肯定有反爬措施:

  • 一定要加完整的请求头(User-Agent、Accept、Referer等)
  • 控制请求频率,别短时间内刷大量请求
  • 如果被IP封禁,可以试试用代理IP轮换

要是你能补充下container1部分的代码,或者说明你想提取什么具体内容,我还能帮你更精准地调试!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:12:07