CSV链接爬取遇断链终止、输出大量None的问题求助
解决方案:跳过错误链接并消除无效输出
我来帮你修复这两个问题,下面是修改后的完整代码,之后会逐一说明关键改动:
#!/usr/bin/python # -*- coding: utf-8 -*- from bs4 import BeautifulSoup import requests from requests.exceptions import RequestException # 导入请求异常类 # 读取CSV文件 with open('urls.csv','r') as f: csv_raw_cont = f.read() # 按行分割,过滤掉空行 split_csv = [line.strip() for line in csv_raw_cont.split('\n') if line.strip()] # 指定分隔符 separator = ";" # 遍历每一行 for each in split_csv: # 获取URL,处理分割后可能的空值 try: url = each.split(separator)[0].strip() if not url: continue except IndexError: print(f"无效行格式:{each}") continue # 处理网络请求异常 try: # 添加超时时间,避免无限等待 response = requests.get(url, timeout=10) response.raise_for_status() # 抛出HTTP错误(比如404、500) html = response.content except RequestException as e: print(f"请求URL失败 {url}: {str(e)}") continue # 解析HTML soup = BeautifulSoup(html,'lxml') # 先找到目标div,避免None调用findAll products_picture_div = soup.find("div", {"class": "productsPicture"}) if not products_picture_div: print(f"页面未找到目标div {url}") continue tags = products_picture_div.findAll("a") for tag in tags: href = tag.get('href') # 只打印非None的href if href: print(href)
关键改动说明:
1. 捕获网络请求异常,避免程序终止
- 导入了
requests.exceptions.RequestException,用try-except包裹请求过程,捕获所有请求相关的错误(比如断网、404、超时等) - 添加了
timeout=10,防止请求无限挂起 - 调用
response.raise_for_status(),把HTTP状态码错误(如404、500)也转为异常捕获 - 遇到错误时打印提示并跳过当前URL,程序继续运行
2. 避免NoneType的AttributeError
- 先将
soup.find("div", {"class": "productsPicture"})的结果保存到变量,判断是否为None - 如果找不到目标div,直接跳过当前页面,不会执行后续的
findAll操作,避免报错
3. 消除None输出
- 先获取
href = tag.get('href'),判断href是否非空,只有当存在有效链接时才打印 - 这样就不会输出那些没有
href属性的a标签对应的None
4. 优化CSV行处理
- 过滤了空行:
[line.strip() for line in csv_raw_cont.split('\n') if line.strip()],避免处理空内容的行 - 处理分割URL时的异常:如果行格式不正确(比如没有分隔符),捕获
IndexError并跳过,避免程序崩溃
5. 增加URL有效性检查
- 分割后对URL做
strip()处理,去掉前后空格,并判断是否为空,避免请求无效的空URL
这样修改后,程序会自动跳过有问题的链接,不会终止运行,同时也不会输出无效的None内容。
内容的提问来源于stack exchange,提问作者AnotherUser31
相关产品推荐
相关产品推荐

