使用Python+BeautifulSoup爬取eBay取价格时列表索引越界如何解决?
错误成因
- 核心原因是你遍历的商品容器中,并非所有节点都包含
class="s-item__price"的span标签:eBay搜索结果页存在无定价的特殊商品(比如拍卖待出价商品、广告占位容器、已下架/未上架商品、价格面议类商品),此时findAll方法会返回空列表,直接取下标[0]就会触发列表索引越界错误。 - 额外补充你现有代码的两处语法疏漏,虽不是当前报错的直接诱因,但也会导致后续运行异常:
- 读取页面源码后缺少BeautifulSoup解析步骤,直接调用
page_soup.findAll会触发未定义报错 - 关闭请求的
close方法漏写括号,实际不会执行请求关闭操作
- 读取页面源码后缺少BeautifulSoup解析步骤,直接调用
修复方案
- 优先对价格标签的返回结果做空判断,再取值,避免直接索引空列表,示例代码如下:
# 方案1:使用findAll加空判断 price_container = container.findAll('span', {'class' : 's-item__price'}) if price_container: price = price_container[0].text.strip() else: # 可自定义默认值,也可直接用continue跳过本条无价格的商品 price = "无定价" # 方案2:改用find方法(匹配不到返回None,判断更简洁) price_tag = container.find('span', {'class' : 's-item__price'}) price = price_tag.text.strip() if price_tag else "无定价"
- 补全你遗漏的页面解析逻辑,修正语法错误:
import bs4 from urllib.request import urlopen as uReq from bs4 import BeautifulSoup as soup my_url = "https://www.ebay.com.au/sch/i.html?_from=R40&_nkw=switch&_sacat=0&_pgn=1" uClient = uReq(my_url) page_html = uClient.read() uClient.close() # 补全方法调用的括号 page_soup = soup(page_html, "html.parser") # 补全页面解析步骤,生成soup对象
内容的提问来源于stack exchange,提问作者Cole Malcolm
相关产品推荐
相关产品推荐

