(原创)使用Python从txt中读取urls,并清理去重,历史输出过的将不再输出
这个Python程序的主要功能是从一个文本文件中读取URLs,并提取出其中的域名。程序还具备记录已输出的URLs,以便下次运行时不会再次输出已经处理过的URLs的功能。以下是程序的主要组成部分和功能:
extract_domain(url) 函数:这个函数使用正则表达式从给定的URL中提取域名。它检查URL是否以http://或https://开头,然后提取域名部分,并将其转换为小写字母。
process_urls_file(file_path, output_set) 函数:这个函数用于处理包含URLs的文本文件。它接受文件路径 file_path 和一个用于记录已输出URLs的集合 output_set。该函数读取文件中的每一行,使用正则表达式查找URLs,提取域名,并检查是否满足以下条件:
域名不在 unique_domains 集合中(确保不重复)。
URL不在 output_set 中(确保不重复输出)。 如果URL满足这些条件,就会将其添加到 extracted_urls 列表中,并记录域名和URL以确保不重复。
主程序部分:在主程序部分,程序首先读取之前已经输出过的URLs,这些URLs被记录在 history_urls.txt 文件中。如果文件不存在,程序会处理这个异常并继续执行。然后,程序调用 process_urls_file 函数来处理 urls.txt 文件中的URLs,并将满足条件的URLs打印为逗号分隔的字符串。最后,程序会将新输出的URLs记录到 history_urls.txt 文件中,以便下次运行时不再输出已处理过的URLs。
这个程序的主要用途是从文本文件中提取URLs,并确保不输出已经处理过的URLs,以及记录输出历史。
import re # 从URL中提取域名 def extract_domain(url): pattern = r"https?://(www\.)?([^/]+)" match = re.match(pattern, url) if match: domain = match.group(2) return domain.lower() else: return None # 从文件中读取URLs并去除重复的域名和空行 def process_urls_file(file_path, output_set): unique_domains = set() # 用于存储唯一的域名 extracted_urls = [] # 用于存储提取的URLs with open(file_path, "r", encoding="utf-8") as file: for line in file: urls = re.findall('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', line) for url in urls: domain = extract_domain(url) if domain and domain not in unique_domains and url not in output_set: unique_domains.add(domain) extracted_urls.append(url) return extracted_urls if __name__ == "__main__": file_path = "urls.txt" output_set = set() # 用于记录已经输出的URLs # 读取已经输出的URLs try: with open("history_urls.txt", "r", encoding="utf-8") as output_file: for line in output_file: url = line.strip() if url: output_set.add(url) except FileNotFoundError: pass extracted_urls = process_urls_file(file_path, output_set) # 将URLs用逗号分隔并打印 url_str = ",".join(extracted_urls) print(url_str) # 记录已经输出的URLs with open("history_urls.txt", "a", encoding="utf-8") as output_file: for url in extracted_urls: output_file.write(url + "\n")
下面这个版本的在运行完后会写入剪切板,方便粘贴
import re import pyperclip # 从URL中提取域名 def extract_domain(url): pattern = r"https?://(www\.)?([^/]+)" match = re.match(pattern, url) if match: domain = match.group(2) return domain.lower() else: return None # 从文件中读取URLs并去除重复的域名和空行 def process_urls_file(file_path, output_set): unique_domains = set() # 用于存储唯一的域名 extracted_urls = [] # 用于存储提取的URLs with open(file_path, "r", encoding="utf-8") as file: for line in file: urls = re.findall('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', line) for url in urls: domain = extract_domain(url) if domain and domain not in unique_domains and url not in output_set: unique_domains.add(domain) extracted_urls.append(url) return extracted_urls if __name__ == "__main__": file_path = "urls.txt" output_set = set() # 用于记录已经输出的URLs # 读取已经输出的URLs try: with open("history_urls.txt", "r", encoding="utf-8") as output_file: for line in output_file: url = line.strip() if url: output_set.add(url) except FileNotFoundError: pass extracted_urls = process_urls_file(file_path, output_set) # 将URLs用逗号分隔并打印 url_str = ",".join(extracted_urls) print(url_str) pyperclip.copy(url_str) # 记录已经输出的URLs with open("history_urls.txt", "a", encoding="utf-8") as output_file: for url in extracted_urls: output_file.write(url + "\n")