如何从Excel的URL列表提取文章标题与内容并保存为TXT文件?代码排障
问题解决方案
现有代码的问题分析
- 变量名逻辑错误:列表推导式里,
Title = [title.text for name in ...]循环变量是name,但取文本用的是未定义的title;Description= [Description.text for desc in ...]把列表名Description当成元素调用,且和循环变量desc混淆,导致无法正确提取内容。 - 缩进错误:Python依赖缩进区分代码块,原代码中
for循环下的print、Save_to_file函数内的代码都没有缩进,逻辑完全不执行。 - 未调用保存函数:仅定义了
Save_to_file但从未执行调用,自然不会生成文件。 - 元素选择器不匹配:目标ebay页面的商品标题class是
s-item__title而非title,描述的class是s-item__subtitle而非description,导致find_all找不到元素,Title和Description为空列表,无输出。 - 未处理Excel文件:需求是从
input.xlsx读取URL,但代码直接写死固定URL,完全未实现核心需求。
完整实现步骤
1. 依赖安装
先安装所需第三方库:
pip install requests beautifulsoup4 openpyxl
2. 满足需求的完整代码
import requests from bs4 import BeautifulSoup from openpyxl import load_workbook import os # 创建输出目录,避免文件散落 save_dir = "article_outputs" os.makedirs(save_dir, exist_ok=True) # 读取Excel中的URL和URL_ID(要求Excel第一列为URL_ID,第二列为文章URL,表头在第一行) wb = load_workbook("input.xlsx") ws = wb.active # 遍历Excel行,跳过表头 for row in ws.iter_rows(min_row=2, values_only=True): url_id, article_url = row[0], row[1] if not article_url: continue try: # 模拟浏览器请求,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(article_url, headers=headers, timeout=10) response.raise_for_status() # 主动抛出请求错误 soup = BeautifulSoup(response.text, "html.parser") # 提取标题(优先找h1标签,可根据目标网站调整选择器) title_tag = soup.find("h1") title_text = title_tag.get_text(strip=True) if title_tag else "无标题" # 移除页眉、页脚、导航等无关元素 for irrelevant in soup.find_all(["header", "footer", "nav", "aside"]): irrelevant.decompose() # 提取正文段落(过滤空内容) content_paragraphs = [] for p in soup.find_all("p"): p_text = p.get_text(strip=True) if p_text: content_paragraphs.append(p_text) content_text = "\n\n".join(content_paragraphs) # 以URL_ID为文件名保存TXT file_path = os.path.join(save_dir, f"{url_id}.txt") with open(file_path, "w", encoding="utf-8") as f: f.write(f"{title_text}\n\n") f.write(content_text) print(f"已完成:{file_path}") except Exception as e: print(f"处理URL {article_url} 失败:{str(e)}") print("所有URL处理完成")
3. 关键注意事项
- Excel格式要求:
input.xlsx需包含两列,第一列是URL_ID,第二列是目标文章URL,表头在第一行。 - 选择器适配:不同网站的标题、正文结构不同,需打开目标网页的开发者工具,查看对应元素的标签或class,替换代码中的
find/find_all参数。 - 反爬处理:添加
User-Agent模拟浏览器请求,避免被网站拦截。
原代码的快速修复(仅爬固定ebay页面)
如果仅需修复原代码的无输出问题,可参考以下修改:
import requests from bs4 import BeautifulSoup url = 'https://www.ebay.com/b/Smart-Watches/178893/bn_152365' headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) response.raise_for_status() soup = BeautifulSoup(response.content, 'html.parser') # 匹配ebay页面实际的元素class titles = [item.get_text(strip=True) for item in soup.find_all('a', class_='s-item__title')] descriptions = [item.get_text(strip=True) for item in soup.find_all('span', class_='s-item__subtitle')] # 修正缩进,避免索引越界 for i in range(min(len(titles), len(descriptions))): print(titles[i]) print(descriptions[i]) print() def save_to_file(): # 用with语句自动管理文件,修正缩进 with open('URL_ID.txt', 'w', encoding="utf-8") as f: for i in range(min(len(titles), len(descriptions))): f.write(titles[i] + "\n") f.write(descriptions[i] + "\n") f.write("\n") # 调用保存函数 save_to_file()
内容的提问来源于stack exchange,提问作者Yash Patil
相关产品推荐
相关产品推荐

