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

Web Scraping问题:调整代码后为何输出为空列表?

问题分析与解决思路

你的代码返回空列表,既可能是请求被网站拦截导致拿到的页面不对,也可能是目标元素的定位方式有误,可以按以下步骤排查:

1. 先确认请求是否拿到了正确的页面

很多网站会拦截urllib.request的默认请求(因为它的User-Agent是Python相关标识,容易被识别为爬虫)。你可以先给请求添加浏览器伪装的请求头,再尝试获取页面:

from bs4 import BeautifulSoup as soup
from urllib.request import Request, urlopen

URL = "https://www.lotuss.com.my/en/category/grocery"
# 添加User-Agent伪装成浏览器请求
req = Request(URL, 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'})
uClient = urlopen(req)
page_html = uClient.read()

page_soup = soup(page_html, "html.parser")
uClient.close()

# 先打印页面的前500个字符,确认是否是正常的商品页面内容
print(page_html[:500])
containers = page_soup.findAll("div",{"class":"product-grid-item"})
print(containers)

如果打印的页面内容包含反爬提示(比如“请验证你是人类”)或者不是商品列表页面,说明是请求被拦截,需要进一步处理(比如添加更多请求头、使用代理等)。

2. 确认目标元素的定位是否正确

如果请求到的页面是正常的,那可能是你定位的元素信息有误:

  • 打开目标网页,按F12打开开发者工具,搜索product-grid-item,确认这个class是否存在,或者是否有多个class(比如元素的class是product-grid-item other-class)。
  • 如果是多个class的情况,可以改用CSS选择器来定位:
    containers = page_soup.select("div.product-grid-item")
    

3. 排查动态加载情况

如果上述方法都无效,大概率是页面内容动态生成的。比如Lotus的商品列表可能是滚动加载或者通过接口异步获取的,这时候可以:

  • 用开发者工具的“网络”面板,查找加载商品数据的API接口,直接请求接口获取数据(效率更高);
  • 或者使用Selenium模拟浏览器访问,等待页面加载完成后再提取元素:
    from selenium import webdriver
    from bs4 import BeautifulSoup as soup
    
    driver = webdriver.Chrome()
    driver.get("https://www.lotuss.com.my/en/category/grocery")
    page_html = driver.page_source
    
    page_soup = soup(page_html, "html.parser")
    containers = page_soup.findAll("div",{"class":"product-grid-item"})
    print(containers)
    
    driver.quit()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:06:37