从文本文件读取URL爬取网页时的400错误与AttributeError问题
问题分析与修复:从文本文件读取URL批量爬取时的400错误与AttributeError
我来帮你拆解下问题根源和修复方法:
为什么从文本文件读取链接会出问题?
核心问题出在文件读取时的换行符和空白字符:
- 当你用
open()直接读取文件的每一行时,每行末尾会自带换行符(Windows是\r\n,Linux/macOS是\n),这些字符会被当成URL的一部分,导致你请求的是类似https://xxx.com\n的无效地址,服务器自然返回400错误。 - 如果你的
article_links.txt里有空行,读取后会得到空字符串,请求空字符串也会触发400错误,进而导致html找不到目标元素变成None,调用html.text就会抛出AttributeError。
而你单独测试或把链接手动放进列表时,肯定是去掉了这些多余字符的,所以能正常运行。
修复方案
修改代码,重点处理读取到的每行内容,同时增加基础的错误处理:
import requests from inscriptis import get_text from bs4 import BeautifulSoup # 用with语句自动管理文件关闭,更安全 with open(r'C:\Users\h473\Documents\Crawling\article_links.txt', "r", encoding="utf-8") as links: for line in links: # 去掉前后空白字符(换行、空格、制表符等) url = line.strip() # 跳过空行 if not url: continue print(f"正在处理链接: {url}") try: page = requests.get(url) # 检查请求是否成功,失败则抛出异常 page.raise_for_status() soup = BeautifulSoup(page.text, 'lxml') html = soup.find(class_='article-wrap') if html is None: html = soup.find(class_='mag-article-wrap') # 再次检查html是否存在,避免AttributeError if html: text = get_text(html.text) print(text) else: print(f"警告:链接 {url} 未找到目标内容容器") except requests.exceptions.RequestException as e: print(f"请求链接 {url} 失败: {str(e)}")
关键改进点
- 用
strip()清理每行的空白字符,确保URL是干净的有效地址。 - 增加空行判断,跳过无效的空内容,避免无意义的请求。
- 使用
with语句管理文件,避免忘记关闭文件,同时代码更简洁安全。 - 加入
page.raise_for_status()主动触发请求异常,方便捕获400/500等HTTP错误。 - 增加
html的二次判断,即使请求成功但找不到目标元素,也不会直接崩溃,而是给出明确提示。
内容的提问来源于stack exchange,提问作者Kristada673
相关产品推荐
相关产品推荐

