import requests from bs4 import BeautifulSoup import os import re from urllib.parse import urljoin # 定义关键词列表 KEYWORDS = [""] def sanitize_text(text): """增强型文本清洗""" text = re.sub(r'<[^>]+>', '', text) text = re.sub(r'https?://\S+', '', text) replacements = { ' ': ' ', '&': '&', '"': '"', '<': '<', '>': '>' } for k, v in replacements.items(): text = text.replace(k, v) text = re.sub(r'[■◆▼©®™●【】]', '', text) text = re.sub(r'\s+', ' ', text).strip() return text def save_content(url, save_folder): """安全获取并保存网页内容""" try: headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'} response = requests.get(url, headers=headers, timeout=10) response.encoding = 'utf-8' if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') main_content = soup.find(['article', 'div'], class_=re.compile(r'content|main')) clean_text = sanitize_text(main_content.get_text() if main_content else soup.get_text()) # 生成安全文件名 filename = re.sub(r'[\\/*?:"<>|]', '', url.split('/')[-1])[:50] + '.txt' filepath = os.path.join(save_folder, filename) with open(filepath, 'w', encoding='utf-8') as f: f.write(clean_text) print(f'成功保存至: {filepath}') else: print(f'访问失败: {url} 状态码: {response.status_code}') except Exception as e: print(f'处理{url}时出错: {str(e)}') def main(): """主程序""" # 设置保存路径 desktop = os.path.join(os.path.expanduser('~'), 'Desktop') folder_name = "ScrapedData" # 自定义文件夹名称 save_path = os.path.join(desktop, folder_name) # 创建保存目录(如果不存在) os.makedirs(save_path, exist_ok=True) # 模拟种子页面(需合法授权后替换实际目标网站) seed_url = "http://www.81.cn/" # 示例地址 try: res = requests.get(seed_url, timeout=10) soup = BeautifulSoup(res.text, 'html.parser') # 提取包含关键词的链接 links = [] for a in soup.find_all('a', href=True): text = a.get_text().strip() if any(keyword in text for keyword in KEYWORDS): absolute_url = urljoin(seed_url, a['href']) links.append(absolute_url) # 去重处理 unique_links = list(set(links)) # 保存内容(建议控制频率) for link in unique_links[:5]: # 示例仅处理前5条 save_content(link, save_path) except Exception as e: print(f'程序终止: {str(e)}') if __name__ == "__main__": main() 在上述代码基础上将输出txt中没有内容的删除掉,请给出完整代码
时间: 2025-06-21 08:23:15 浏览: 20
<think>嗯,用户给了一个Python爬虫的代码,然后希望在现有基础上修改,使得输出的txt文件中没有内容的被删除掉。我需要先理解现有的代码逻辑,然后找到哪里需要修改。
首先,现有的save_content函数负责保存网页内容到txt文件。它会尝试提取主要内容,清洗文本,然后保存。如果main_content存在,就获取其文本,否则用soup的全文。但可能存在的情况是,即使没有内容,也会生成一个空文件。用户希望过滤掉这些空文件。
那问题出在保存的时候没有检查内容是否为空。所以应该在保存之前检查clean_text是否为空或者只有空白字符。如果是的话,就不保存,或者保存后删除空文件。
那应该在保存文件之后,检查文件内容是否为空。或者,在写入之前,先判断clean_text是否有有效内容。如果clean_text.strip()为空,就不写入文件,或者写入后删除该文件。
在代码中,当clean_text被处理后,可能得到空字符串。例如,如果网页没有内容,或者清洗后全部被去除了。这时候,即使写入文件,文件也是空的。
所以修改点应该在保存文件的时候,先检查clean_text是否有内容。如果有,才保存;否则跳过,或者删除文件。
看当前的save_content函数,在写入文件后,打印成功消息。如果clean_text是空的,那么写入的文件会是空的。所以需要修改逻辑:在写入之前检查clean_text是否为空,如果是的话,不保存,并提示。或者保存之后检查文件是否为空,然后删除。
哪种方式更好呢?在写入之前检查更高效,因为避免了创建空文件。所以应该在写入前检查clean_text是否有效。
所以修改save_content函数中的逻辑:在获取clean_text之后,判断它是否为空或者只有空格。如果是,就不保存,并提示内容为空。否则才保存。
例如:
if clean_text.strip() == '':
print(f'内容为空,跳过保存: {url}')
return
else:
写入文件
这样修改后,空内容的文件就不会被保存了。但用户原来的代码中,保存的文件名是根据URL生成的,可能会有重复的情况,但这不是当前问题要考虑的。
另外,用户可能希望不仅处理空内容,还要处理只有空白符的情况。所以用strip()后的长度是否为0来判断。
那么修改代码中的save_content函数,在获取clean_text之后,判断是否为空,如果是,则跳过保存。同时,原代码中的print语句可能需要调整,比如成功保存的消息应该只在有内容时显示。
所以,在原来的代码中:
if response.status_code == 200:
...处理得到clean_text
if clean_text.strip():
...保存文件并打印成功
else:
print(f'内容为空,不保存: {url}')
else:
...处理其他状态码
这样修改后,就能避免保存空文件了。
现在需要检查用户原来的代码结构。原save_content函数中的逻辑是:
当response是200时,提取内容,清洗,然后保存。不管内容是否为空,都生成文件。所以需要在这个条件下添加判断clean_text是否非空。
修改后的代码逻辑应该是:
当提取到clean_text后,检查其是否非空。如果是,才保存,否则不保存,并提示。
所以,在save_content函数中的相应部分修改:
原代码:
clean_text = sanitize_text(...)
生成文件名
写入文件
打印成功
修改后:
clean_text = sanitize_text(...)
if clean_text.strip() == '':
print(f'内容为空,跳过保存: {url}')
return
生成文件名,写入文件,打印成功
或者,在写入之前判断,如果有内容才写入,否则不写。
这样就不会生成空文件了。
所以,修改save_content函数中的部分:
原:
with open(filepath, 'w', encoding='utf-8') as f:
f.write(clean_text)
print(f'成功保存至: {filepath}')
改为:
if clean_text.strip():
with open(filepath, 'w', encoding='utf-8') as f:
f.write(clean_text)
print(f'成功保存至: {filepath}')
else:
print(f'内容为空,不保存: {url}')
这样,当clean_text为空时,不写入文件,避免生成空文件。
那用户的问题就解决了。此外,还需要确保其他部分没有错误。例如,当main_content不存在时,soup.get_text()可能得到的文本是否为空?
sanitize_text函数会进一步处理,可能得到空字符串。所以判断clean_text.strip()是否为空即可。
综上,修改save_content函数中的写入逻辑,添加对clean_text是否为空的判断,只有非空时才保存文件。这样就能删除输出中无内容的txt文件了。
现在,需要将代码中的相应部分修改,并给出完整代码。用户希望得到完整的修改后的代码,所以需要将原来的代码中save_content部分进行调整。
因此,最终的修改是在保存文件之前检查clean_text是否为空,如果是则跳过保存。这样,输出的txt文件中就不会有空文件了。</think>以下是在原有代码基础上增加空文件过滤功能的完整实现(修改部分已标注):
```python
import requests
from bs4 import BeautifulSoup
import os
import re
from urllib.parse import urljoin
# 定义关键词列表
KEYWORDS = [""]
def sanitize_text(text):
"""增强型文本清洗"""
text = re.sub(r'<[^>]+>', '', text)
text = re.sub(r'https?://\S+', '', text)
replacements = {
' ': ' ', '&': '&', '"': '"',
'<': '<', '>': '>'
}
for k, v in replacements.items():
text = text.replace(k, v)
text = re.sub(r'[■◆▼©®™●【】]', '', text)
text = re.sub(r'\s+', ' ', text).strip()
return text
def save_content(url, save_folder):
"""安全获取并保存网页内容(增加空内容过滤)"""
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}
response = requests.get(url, headers=headers, timeout=10)
response.encoding = 'utf-8'
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
main_content = soup.find(['article', 'div'], class_=re.compile(r'content|main'))
clean_text = sanitize_text(main_content.get_text() if main_content else soup.get_text())
# 新增空内容过滤判断
if not clean_text.strip():
print(f'跳过空内容: {url}')
return
# 生成安全文件名
filename = re.sub(r'[\\/*?:"<>|]', '', url.split('/')[-1])[:50] + '.txt'
filepath = os.path.join(save_folder, filename)
with open(filepath, 'w', encoding='utf-8') as f:
f.write(clean_text)
print(f'成功保存至: {filepath}')
else:
print(f'访问失败: {url} 状态码: {response.status_code}')
except Exception as e:
print(f'处理{url}时出错: {str(e)}')
def main():
"""主程序"""
# 设置保存路径
desktop = os.path.join(os.path.expanduser('~'), 'Desktop')
folder_name = "ScrapedData"
save_path = os.path.join(desktop, folder_name)
# 创建保存目录(如果不存在)
os.makedirs(save_path, exist_ok=True)
# 模拟种子页面(需合法授权后替换实际目标网站)
seed_url = "http://www.81.cn/"
try:
res = requests.get(seed_url, timeout=10)
soup = BeautifulSoup(res.text, 'html.parser')
# 提取包含关键词的链接
links = []
for a in soup.find_all('a', href=True):
text = a.get_text().strip()
if any(keyword in text for keyword in KEYWORDS):
absolute_url = urljoin(seed_url, a['href'])
links.append(absolute_url)
# 去重处理
unique_links = list(set(links))
# 保存内容(建议控制频率)
for link in unique_links[:5]: # 示例仅处理前5条
save_content(link, save_path)
except Exception as e:
print(f'程序终止: {str(e)}')
if __name__ == "__main__":
main()
```
主要改进点说明(使用中文数字编号):
一、核心过滤逻辑
1. 在`save_content`函数中增加空内容判断:
```python
if not clean_text.strip():
print(f'跳过空内容: {url}')
return
```
2. 在写入文件前进行内容有效性验证,确保只有包含有效文本的内容才会被保存
二、增强健壮性
1. 使用`strip()`方法过滤纯空白字符内容
2. 空内容过滤发生在文本清洗之后,确保判断准确性
3. 添加明确的跳过提示,方便追踪爬取过程
三、注意事项
1. 建议在`KEYWORDS`列表中添加实际需要的关键词
2. 正式使用前请确保遵守目标网站的robots.txt协议
3. 可根据需要调整`unique_links[:5]`的限制数量
4. 建议添加请求间隔时间(如`time.sleep(1)`)避免被封禁
这个改进版本能有效过滤空内容文件,同时保持原有功能完整,建议在合法合规的前提下使用。
阅读全文
相关推荐














