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

使用BeautifulSoup按文本筛选时出现列表索引越界的原因排查

解决爬取OEM目录时的"list index out of range"错误

错误原因

你遇到的list index out of range错误,是因为doc.find_all(text="ANS-")返回了空列表——网页里没有完全等于"ANS-"的独立文本节点,所以访问ANS[0]自然会报错。

修正步骤

1. 先验证请求状态

在处理网页内容前,先确认请求是否成功,避免因网络问题或反爬导致的空页面:

import requests
from bs4 import BeautifulSoup

url = "https://www.advantagenationalsupply.com/oem-catalog/"
result = requests.get(url)
# 确认请求成功
if result.status_code != 200:
    print(f"请求失败,状态码:{result.status_code}")
    exit()

doc = BeautifulSoup(result.text, "html.parser")

2. 匹配包含"ANS-"的文本

不要用精确匹配,改用包含匹配来定位所有带ANS-的文本:

# 找到所有包含"ANS-"的文本节点
ANS_nodes = doc.find_all(text=lambda t: t and "ANS-" in t.strip())

这里用lambda函数过滤文本,确保文本存在且包含目标字符串,同时用strip()去除前后空白,避免漏判。

3. 安全访问列表元素并提取目标信息

在访问列表元素前,先判断列表是否为空,再从对应节点提取OEM、OEM Number等信息:

if ANS_nodes:
    # 定位到ANS编号所在的表格行
    row = ANS_nodes[0].find_parent("tr")
    if row:
        columns = row.find_all("td")
        # 确保列数足够提取目标字段
        if len(columns) >= 4:
            oem = columns[0].get_text(strip=True)
            oem_num = columns[1].get_text(strip=True)
            desc = columns[2].get_text(strip=True)
            ans_num = columns[3].get_text(strip=True)
            print(f"OEM: {oem}, OEM Number: {oem_num}, Description: {desc}, ANS-Number: {ans_num}")
else:
    print("未找到包含ANS-的内容")

4. 应对动态加载场景

如果上述方法还是找不到内容,可能网页是JavaScript动态加载的。这种情况下requests无法获取动态渲染的内容,需要改用selenium模拟浏览器加载页面:

from selenium import webdriver
from bs4 import BeautifulSoup
import time

driver = webdriver.Chrome()
driver.get(url)
time.sleep(2)  # 等待页面加载完成

doc = BeautifulSoup(driver.page_source, "html.parser")
# 后续处理和之前一致
driver.quit()

关键提示

  • 网页结构可能会变化,建议用浏览器开发者工具(F12)查看目标元素的实际位置,确认ANS-所在的HTML结构(比如表格行、列表项),再调整定位逻辑。
  • 爬取前注意网站的robots.txt规则,避免违反爬取规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 04:01:14