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

