You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.5 KiB
68 lines
2.5 KiB
import sys
|
|
from typing import List, Dict, Any
|
|
|
|
|
|
class ConsoleView:
|
|
def display_message(self, message: str):
|
|
try:
|
|
print(message)
|
|
except UnicodeEncodeError:
|
|
print(message.encode('utf-8', errors='replace').decode('utf-8'))
|
|
|
|
def display_error(self, error: str):
|
|
try:
|
|
print(f"[ERROR] {error}")
|
|
except UnicodeEncodeError:
|
|
print(f"[ERROR] {error.encode('utf-8', errors='replace').decode('utf-8')}")
|
|
|
|
def display_success(self, message: str):
|
|
try:
|
|
print(f"[SUCCESS] {message}")
|
|
except UnicodeEncodeError:
|
|
print(f"[SUCCESS] {message.encode('utf-8', errors='replace').decode('utf-8')}")
|
|
|
|
def display_strategies(self, strategies: List[Dict[str, str]]):
|
|
print("\n=== Available Scrapers ===")
|
|
for idx, strategy in enumerate(strategies, 1):
|
|
print(f"{idx}. {strategy['name']}")
|
|
print(f" Source: {strategy['source']}")
|
|
print()
|
|
|
|
def display_scraped_data(self, data: Any, saved_path: str = None):
|
|
if hasattr(data, 'to_dict'):
|
|
data = data.to_dict()
|
|
|
|
print("\n=== Scraping Results ===")
|
|
print(f"Source: {data.get('source', 'N/A')}")
|
|
print(f"Strategy: {data.get('strategy_name', 'N/A')}")
|
|
print(f"Total Items: {data.get('total_items', len(data.get('items', [])))}")
|
|
print(f"Scraped At: {data.get('scraped_at', 'N/A')}")
|
|
|
|
if saved_path:
|
|
print(f"Saved To: {saved_path}")
|
|
|
|
print("\n--- Items Preview ---")
|
|
items = data.get('items', [])
|
|
for idx, item in enumerate(items[:5], 1):
|
|
try:
|
|
title = item.get('title', 'N/A')
|
|
print(f"{idx}. {title}")
|
|
except UnicodeEncodeError:
|
|
print(f"{idx}. {item.get('title', 'N/A').encode('utf-8', errors='replace').decode('utf-8')}")
|
|
|
|
if item.get('content'):
|
|
content = item.get('content', '')
|
|
try:
|
|
truncated = content[:80] + "..." if len(content) > 80 else content
|
|
print(f" {truncated}")
|
|
except UnicodeEncodeError:
|
|
truncated = content[:80].encode('utf-8', errors='replace').decode('utf-8')
|
|
print(f" {truncated}")
|
|
print()
|
|
|
|
if len(items) > 5:
|
|
print(f"... and {len(items) - 5} more items")
|
|
|
|
def display_list(self, items: List[Any]):
|
|
for item in items:
|
|
print(item)
|
|
|