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

BeautifulSoup find_all仅返回前50个标签的问题求助

问题原因

你遇到的情况是因为该网站的菜单采用动态加载机制:初始请求返回的静态HTML仅包含前50个菜品,剩下的内容会在用户滚动页面时通过异步请求逐步加载。直接用urllib获取静态HTML自然只能拿到已加载的50条数据。


解决方案

方法一:用Selenium模拟浏览器加载全部内容

Selenium可以模拟真实浏览器的滚动操作,触发所有菜品的加载,再获取完整页面源码进行解析。

  1. 先安装依赖:
pip install selenium
  1. 下载对应浏览器的驱动(比如Chrome的ChromeDriver,需与浏览器版本匹配),确保驱动在系统PATH中或指定路径。
  2. 示例代码:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time

url = 'https://wolt.com/az/aze/baku/restaurant/mcdonalds-nnrimanov-ms'
driver = webdriver.Chrome()  # 若驱动不在PATH,可指定路径:webdriver.Chrome(executable_path='./chromedriver')
driver.get(url)

# 循环滚动页面,直到内容不再加载
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)  # 等待加载时间,可根据网络情况调整
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

# 确保所有目标元素加载完成
WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CLASS_NAME, 'MenuItem-module__content___mNrbB'))
)

# 获取完整页面源码并解析
html = driver.page_source
driver.quit()
soup = BeautifulSoup(html, 'html.parser')
modules = soup.find_all('div', attrs={'class': 'MenuItem-module__content___mNrbB'})
print(len(modules))

方法二:直接调用网站API接口(更高效)

动态网站的内容通常来自后端API,直接请求API比模拟浏览器更快捷、资源消耗更低。

  1. 打开浏览器DevTools(F12),切换到「Network」面板,刷新页面并滚动加载菜单,筛选「XHR」类型的请求,找到包含菜品数据的接口(可搜索menu、items等关键词)。
  2. 复制接口地址和必要的请求头(比如User-Agent),直接用requests请求获取JSON数据:
import requests

# 替换为你抓包得到的真实API地址
api_url = "https://wolt.com/api/v1/venues/slug/mcdonalds-nnrimanov-ms/menu"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}

response = requests.get(api_url, headers=headers)
menu_data = response.json()

# 根据实际JSON结构提取菜品列表,示例仅供参考
items = []
for category in menu_data.get('categories', []):
    items.extend(category.get('items', []))
print(len(items))

注意:API接口可能随网站更新变化,需自行抓包确认;部分接口可能需要携带额外参数(如认证信息),需从浏览器请求中复制。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:09:31