Last active
May 5, 2025 07:31
-
-
Save me-suzy/1ace00daf901116cd780d75d3d8ed2b1 to your computer and use it in GitHub Desktop.
Categorii - verifica si afiseaza link-urile in plus sau in minus ro si en
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import re | |
from collections import defaultdict | |
from bs4 import BeautifulSoup | |
# Directoarele care trebuie verificate | |
directories = [ | |
r'e:\Carte\BB\17 - Site Leadership\Principal\ro', | |
r'e:\Carte\BB\17 - Site Leadership\Principal\en' | |
] | |
def extract_sections(html_content): | |
"""Extrage secțiunile dintre marcajele specificate.""" | |
pattern = r'<!-- ARTICOL CATEGORIE START -->(.*?)<!-- ARTICOL CATEGORIE FINAL -->' | |
sections = re.findall(pattern, html_content, re.DOTALL) | |
# Dacă nu există marcajul final, încearcă să extragi doar de la marcajul de început | |
if not sections: | |
pattern = r'<!-- ARTICOL CATEGORIE START -->(.*)' | |
sections = re.findall(pattern, html_content, re.DOTALL) | |
return sections | |
def extract_relevant_urls(section): | |
"""Extrage URL-urile relevante din titlu și 'citește mai departe'.""" | |
soup = BeautifulSoup(section, 'html.parser') | |
urls = [] | |
url_sources = [] # Pentru a ține evidența sursei fiecărui URL | |
# Extrage URL-urile din titluri (span class="den_articol") | |
for title_span in soup.find_all('span', class_='den_articol'): | |
for a_tag in title_span.find_all('a', href=True): | |
if a_tag['href'].startswith('http'): | |
urls.append(a_tag['href']) | |
url_sources.append('titlu') | |
# Extrage URL-urile din "citește mai departe" (div align="right" id="external2") | |
for external_div in soup.find_all('div', id='external2'): | |
for a_tag in external_div.find_all('a', href=True): | |
if a_tag['href'].startswith('http') and not a_tag.find('img'): # Exclude link-urile cu imagini | |
urls.append(a_tag['href']) | |
url_sources.append('citeste_mai_departe') | |
return urls, url_sources | |
def read_file_with_multiple_encodings(file_path): | |
"""Încearcă să citească fișierul cu diferite codificări.""" | |
encodings = ['utf-8', 'latin-1', 'cp1252', 'iso-8859-1'] | |
for encoding in encodings: | |
try: | |
with open(file_path, 'r', encoding=encoding) as file: | |
return file.read() | |
except UnicodeDecodeError: | |
continue | |
raise UnicodeDecodeError(f"Nu s-a putut citi fișierul {file_path} cu niciuna din codificările: {encodings}") | |
def check_file_for_link_issues(file_path): | |
"""Verifică dacă un fișier HTML conține link-uri problematice.""" | |
try: | |
content = read_file_with_multiple_encodings(file_path) | |
sections = extract_sections(content) | |
if not sections: | |
return None | |
# Pentru fiecare tip de problemă | |
repeated_links_sections = [] # Link-uri care apar de mai mult de 2 ori | |
mismatched_links_sections = [] # Link-uri diferite între titlu și "citește mai departe" | |
for section_idx, section in enumerate(sections): | |
urls, url_sources = extract_relevant_urls(section) | |
url_counts = defaultdict(int) | |
for url in urls: | |
url_counts[url] += 1 | |
# 1. Verifică dacă există link-uri care se repetă de mai mult de 2 ori | |
problematic_urls = [] | |
for url, count in url_counts.items(): | |
if count > 2: # Un link normal ar trebui să apară doar de 2 ori (titlu + "citește mai departe") | |
problematic_urls.append((url, count)) | |
if problematic_urls: | |
repeated_links_sections.append((section_idx+1, problematic_urls)) | |
# 2. Identifică perechi de URL-uri din titlu și "citește mai departe" | |
title_urls = [] | |
citeste_urls = [] | |
for i, url in enumerate(urls): | |
if i < len(url_sources) and url_sources[i] == 'titlu': | |
title_urls.append(url) | |
elif i < len(url_sources) and url_sources[i] == 'citeste_mai_departe': | |
citeste_urls.append(url) | |
# Verifică dacă avem și titlu și "citește mai departe" dar sunt diferite | |
if title_urls and citeste_urls and title_urls[0] != citeste_urls[0]: | |
mismatched_links_sections.append((section_idx+1, title_urls[0], citeste_urls[0])) | |
if repeated_links_sections or mismatched_links_sections: | |
return (file_path, repeated_links_sections, mismatched_links_sections) | |
return None | |
except Exception as e: | |
print(f"Eroare la procesarea fișierului {file_path}: {e}") | |
return None | |
def main(): | |
files_with_problems = [] | |
total_files = 0 | |
processed_files = 0 | |
print("Începe procesarea fișierelor HTML...") | |
# Procesează doar fișierele din directoarele principale, fără subfolderele | |
for directory in directories: | |
print(f"Scanez directorul: {directory}") | |
try: | |
for file in os.listdir(directory): | |
file_path = os.path.join(directory, file) | |
# Verifică dacă este fișier și are extensia .html sau .htm | |
if os.path.isfile(file_path) and (file.lower().endswith('.html') or file.lower().endswith('.htm')): | |
total_files += 1 | |
except Exception as e: | |
print(f"Eroare la listarea fișierelor din directorul {directory}: {e}") | |
# Procesează fișierele | |
for directory in directories: | |
try: | |
for file in os.listdir(directory): | |
file_path = os.path.join(directory, file) | |
# Verifică dacă este fișier și are extensia .html sau .htm | |
if os.path.isfile(file_path) and (file.lower().endswith('.html') or file.lower().endswith('.htm')): | |
processed_files += 1 | |
print(f"[{processed_files}/{total_files}] {file}") | |
result = check_file_for_link_issues(file_path) | |
if result: | |
files_with_problems.append(result) | |
except Exception as e: | |
print(f"Eroare la procesarea fișierelor din directorul {directory}: {e}") | |
# Afișează doar sumarul erorilor | |
if files_with_problems: | |
print("\nSUMAR ERORI:") | |
# Numără fiecare tip de problemă | |
files_with_repeated_links = sum(1 for f in files_with_problems if f[1]) | |
files_with_mismatched_links = sum(1 for f in files_with_problems if f[2]) | |
print(f"- Fișiere cu link-uri care apar de mai mult de 2 ori: {files_with_repeated_links}") | |
print(f"- Fișiere cu link-uri diferite în titlu și 'citește mai departe': {files_with_mismatched_links}") | |
# Afișează doar lista perechilor de URL-uri diferite între titlu și "citește mai departe", fără comentarii | |
if files_with_mismatched_links > 0: | |
print("\nLista perechilor de URL-uri diferite între titlu și 'citește mai departe':") | |
print("--------------") | |
for file_path, _, mismatched_pairs in files_with_problems: | |
if mismatched_pairs: | |
for section_idx, url_titlu, url_citeste in mismatched_pairs: | |
print(f"{os.path.basename(file_path)}, Secțiunea {section_idx}:") | |
print(f" Titlu: {url_titlu}") | |
print(f" Citește: {url_citeste}") | |
print("") # Adaugă un rând gol între fiecare pereche | |
else: | |
print("\nNu s-au găsit fișiere cu link-uri problematice.") | |
print(f"\nProcesare completă: {processed_files} fișiere verificate.") | |
if __name__ == "__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment