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

