File size: 6,034 Bytes
126d81e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import json
from typing import Any, Dict
import asyncio
from datetime import datetime, timedelta
import re
from crawl4ai import AsyncWebCrawler
from crawl4ai.extraction_strategy import JsonCssExtractionStrategy


schema_short= {
        "name": "VnExpress",
        "baseSelector": "div.sidebar-1",
        "fields": [
            {
                "name": "description",
                "selector": "article p.Normal",
                "type": "list",
                "fields": [
                    {"name": "description", "type": "text"},
                ]
            },
            {
                "name": "genres",
                "selector": "div.header-content ul.breadcrumb li a",
                "type": "list",
                "fields": [
                    {"name": "genres", "type": "text"},
                ]
            }
        ]
    }
url =  "https://vnexpress.net/co-nen-bo-30-trieu-dong-de-hoc-them-mot-bang-o-tuoi-40-4825599.html"


async def return_json(schema: Dict[str, Any], url: str) -> Dict[str, Any]:
    extraction_strategy = JsonCssExtractionStrategy(schema, verbose=True)
    async with AsyncWebCrawler(always_by_pass_cache=True) as crawler:
        result = await crawler.arun(
            url=url,
            exclude_external_links=True,
            bypass_cache=True,
            verbose=False,
            warning=False,
            extraction_strategy=extraction_strategy
        )    
        news_teasers = json.loads(result.extracted_content)
        return news_teasers
    

from datetime import datetime
import re

def chuan_hoa_time(time_str):
    days_map = {
        "thứ bảy": "Saturday",
        "chủ nhật": "Sunday",
        "thứ hai": "Monday",
        "thứ ba": "Tuesday",
        "thứ tư": "Wednesday",
        "thứ năm": "Thursday",
        "thứ sáu": "Friday",
    }

    month_map = {
        "tháng 1": "January", "tháng 2": "February", "tháng 3": "March",
        "tháng 4": "April", "tháng 5": "May", "tháng 6": "June",
        "tháng 7": "July", "tháng 8": "August", "tháng 9": "September",
        "tháng 10": "October", "tháng 11": "November", "tháng 12": "December"
    }

    # Làm sạch chuỗi thời gian
    if isinstance(time_str, datetime):
        # Nếu là đối tượng datetime, chuyển sang chuỗi
        time_str = time_str.strftime('%Y-%m-%d %H:%M:%S')
    elif not isinstance(time_str, str):
        # Nếu không phải là chuỗi hoặc datetime, trả về chuỗi rỗng
        return ""
    time_str = time_str.lower().strip()
    
    
    now = datetime.now()
    if "phút trước" in time_str:
        minutes = int(re.search(r"(\d+)", time_str).group(1))
        time_result = now - timedelta(minutes=minutes)
        return time_result.strftime("%d/%m/%Y %H:%M")
    elif "giờ trước" in time_str:
        hours = int(re.search(r"(\d+)", time_str).group(1))
        time_result = now - timedelta(hours=hours)
        return time_result.strftime("%d/%m/%Y %H:%M")
    elif "hôm qua" in time_str:
        time_result = now - timedelta(days=1)
        return time_result.strftime("%d/%m/%Y %H:%M")
    elif "ngày trước" in time_str:
        days = int(re.search(r"(\d+)", time_str).group(1))
        time_result = now - timedelta(days=days)
        return time_result.strftime("%d/%m/%Y %H:%M")

    # Sửa các lỗi chính tả thông thường
    time_str = re.sub(r"\s?\(gmt[+\-]\d{1,2}\)", "", time_str).strip()  # Loại bỏ múi giờ
    time_str = time_str.replace("|", "")  # Loại bỏ ký tự phân cách '|'
    # time_str = time_str.replace(",", "")  # Loại bỏ dấu phẩy nếu có
    time_str = re.sub(r"\s+", " ", time_str).strip()  # Loại bỏ khoảng trắng thừa

    # Nếu chuỗi có dạng "20241202 15:44", cần chèn dấu "/" vào
    if re.match(r"^\d{8} \d{2}:\d{2}$", time_str):
        time_str = f"{time_str[:4]}/{time_str[4:6]}/{time_str[6:8]} {time_str[9:]}"

    # Thêm dấu phẩy nếu thiếu sau ngày
    if re.match(r"^[a-z]+ \d{2}/\d{2}/\d{4} \d{2}:\d{2}$", time_str):
        time_str = time_str.replace(" ", ", ", 1)  # Thêm dấu phẩy sau ngày

    # Thay thế tháng tiếng Việt thành tiếng Anh
    for vietnamese_month, english_month in month_map.items():
        time_str = time_str.replace(vietnamese_month, english_month)

    # Thay thế ngày trong tuần
    for vietnamese_day, english_day in days_map.items():
        time_str = time_str.replace(vietnamese_day, english_day)

    # Định dạng chuỗi thời gian chuẩn
    formats = [
        "%A, %d/%m/%Y %H:%M",          # Monday, 2/12/2024 11:33
        "%Y-%m-%d %H:%M:%S",           # 2024-11-29 16:01:23
        "%Y-%m-%dT%H:%M:%S",           # 2024-11-30T10:20:00
        "%A, %d/%m/%Y - %H:%M",        # Monday, 2/12/2024 - 11:33
        "%A, %d/%m/%Y, %H:%M",         # Monday, 2/12/2024, 11:33
        "%Y-%m-%d %H:%M",              # 2024-12-01 08:00
        "%H:%M, %d/%m/%Y",             # 10:45, 01/12/2024
        "%d %B %Y %H:%M",              # 2 December 2024 11:33
        "%d/%m/%Y %H:%M",              # 02/12/2024 15:22
        "%d %b %Y %H:%M",              # 2 Dec 2024 11:33
        "%d/%m/%Y %H:%M:%S",           # 02/12/2024 15:22:00
        "%A, %d/%m/%Y %H:%M %z",       # Monday, 02/12/2024 10:08 +0700
        "%b %d, %Y %H:%M",             # Dec 2, 2024 15:22
        "%d tháng %m, %Y | %H:%M",     # 2 tháng 12, 2024 | 15:10
        "%A, %d/%m/%Y - %H:%M",        # thứ hai, 02/12/2024 - 15:40
        "%Y,%m,%d %H:%M",              # 2024,12,02 15:44
        "%A, %d/%m/%Y , %H:%M"         # Monday, 02/12/2024 , 16:01
    ]

    for fmt in formats:
        try:
            dt =datetime.strptime(time_str, fmt)
            return dt
        except ValueError:
            continue
    raise ValueError(f"Không thể chuẩn hóa chuỗi thời gian: {time_str}")