You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Python爬虫返回的DD-MM-YYYY日期转为ISO 8601格式?

Fixing Date Format from DD-MM-YYYY to ISO 8601 (YYYY-MM-DD) in Your Scraper

No problem at all—let's get that date format sorted out. The core issue is converting the string you're getting (DD-MM-YYYY) into a proper datetime object, then reformatting it to the ISO 8601 standard. I also noticed your original code cuts off mid-way, so I'll clean that up too.

Step-by-Step Fix

  1. Parse the raw date string: Use datetime.strptime() to turn the DD-MM-YYYY string into a datetime object.
  2. Reformat to ISO 8601: Use strftime() to convert that object back to a string in YYYY-MM-DD format.
  3. Add error handling: Optional but smart—wrap the date parsing in a try/except block to avoid crashes if a date is missing or malformed.

Modified Full Code

import requests
import json
from datetime import datetime

URL = 'http://tfda.go.tz/portal/en/trader_module/trader_module/getRegisteredDrugs_products'
payload = "draw=1&columns%5B0%5D%5Bdata%5D=no&columns%5B0%5D%5Bname%5D=&columns%5B0%5D%5Bsearchable%5D=True&columns%5B0%5D%5Borderable%5D=True&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B1%5D%5Bdata%5D=certificate_no&columns%5B1%5D%5Bname%5D=&columns%5B1%5D%5Bsearchable%5D=True&columns%5B1%5D%5Borderable%5D=True&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B2%5D%5Bdata%5D=brand_name&columns%5B2%5D%5Bname%5D=&columns%5B2%5D%5Bsearchable%5D=True&columns%5B2%5D%5Borderable%5D=True&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B3%5D%5Bdata%5D=classification_name&columns%5B3%5D%5Bname%5D=&columns%5B3%5D%5Bsearchable%5D=True&columns%5B3%5D%5Borderable%5D=True&columns%5B3%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B3%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B4%5D%5Bdata%5D=common_name&columns%5B4%5D%5Bname%5D=&columns%5B4%5D%5Bsearchable%5D=True&columns%5B4%5D%5Borderable%5D=True&columns%5B4%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B4%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B5%5D%5Bdata%5D=dosage_form&columns%5B5%5D%5Bname%5D=&columns%5B5%5D%5Bsearchable%5D=True&columns%5B5%5D%5Borderable%5D=True&columns%5B5%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B5%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B6%5D%5Bdata%5D=product_strength&columns%5B6%5D%5Bname%5D=&columns%5B6%5D%5Bsearchable%5D=True&columns%5B6%5D%5Borderable%5D=True&columns%5B6%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B6%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B7%5D%5Bdata%5D=registrant&columns%5B7%5D%5Bname%5D=&columns%5B7%5D%5Bsearchable%5D=True&columns%5B7%5D%5Borderable%5D=True&columns%5B7%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B7%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B8%5D%5Bdata%5D=registrant_country&columns%5B8%5D%5Bname%5D=&columns%5B8%5D%5Bsearchable%5D=True&columns%5B8%5D%5Borderable%5D=True&columns%5B8%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B8%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B9%5D%5Bdata%5D=manufacturer&columns%5B9%5D%5Bname%5D=&columns%5B9%5D%5Bsearchable%5D=True&columns%5B9%5D%5Borderable%5D=True&columns%5B9%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B9%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B10%5D%5Bdata%5D=manufacturer_country&columns%5B10%5D%5Bname%5D=&columns%5B10%5D%5Bsearchable%5D=True&columns%5B10%5D%5Borderable%5D=True&columns%5B10%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B10%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B11%5D%5Bdata%5D=expiry_date&columns%5B11%5D%5Bname%5D=&columns%5B11%5D%5Bsearchable%5D=True&columns%5B11%5D%5Borderable%5D=True&columns%5B11%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B11%5D%5Bsearch%5D%5Bregex%5D=False&columns%5B12%5D%5Bdata%5D=id&columns%5B12%5D%5Bname%5D=&columns%5B12%5D%5Bsearchable%5D=True&columns%5B12%5D%5Borderable%5D=True&columns%5B12%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B12%5D%5Bsearch%5D%5Bregex%5D=False&order%5B0%5D%5Bcolumn%5D=0&order%5B0%5D%5Bdir%5D=asc&start=0&length=3911&search%5Bvalue%5D=&search%5Bregex%5D=False"

with requests.Session() as s:
    s.headers={"User-Agent":"Mozilla/5.0"}
    s.headers.update({'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'})
    res = s.post(URL, data=payload)

# Collect all processed data into a list
processed_data = []

for item in res.json()['data']:
    # Extract all fields as before
    serial = item['no']
    id_no = item['id']
    certno = item['certificate_no']
    brndname = item['brand_name']
    clssification = item['classification_name']
    common_name = item['common_name']
    dosage_form = item['dosage_form']
    raw_expiry_date = item['expiry_date']
    manufacturer = item['manufacturer']
    manufacturer_country = item['manufacturer_country']
    product_strength = item['product_strength']
    registrant = item['registrant']
    registrant_country = item['registrant_country']

    # Convert date format with error handling
    expiry_date_iso = raw_expiry_date  # Fallback to original if parsing fails
    try:
        # Parse DD-MM-YYYY string to datetime object
        expiry_date_obj = datetime.strptime(raw_expiry_date, '%d-%m-%Y')
        # Format to ISO 8601 YYYY-MM-DD
        expiry_date_iso = expiry_date_obj.strftime('%Y-%m-%d')
    except ValueError:
        # Print a warning if date is invalid, but keep going
        print(f"Warning: Invalid date format for item {serial}: {raw_expiry_date}")

    # Build the data dictionary with formatted date
    data_entry = {
        'common_name': common_name,
        'brandname': brndname,
        'classification_name': clssification,
        'cerficate_number': certno,
        'registrant': registrant,
        'registrant_country': registrant_country,
        'manufacturer': manufacturer,
        'manufacturer_country': manufacturer_country,
        'product_strength': product_strength,
        'dosage_form': dosage_form,
        'expiry_date': expiry_date_iso
    }
    processed_data.append(data_entry)

# Dump the full list to JSON (fixed the cut-off line)
dumped_json = json.dumps(processed_data, ensure_ascii=False, indent=2)

# Optional: Write to a file
with open('registered_drugs.json', 'w', encoding='utf-8') as f:
    f.write(dumped_json)

print("Data processed successfully! Check registered_drugs.json for output.")

Key Changes Explained

  • Date Conversion: The try/except block ensures your script doesn't crash if it encounters a malformed date (like an empty string or wrong format). It falls back to the original date string in those cases.
  • Complete JSON Output: I fixed the incomplete json.dumps() call and added code to collect all entries into a list before dumping—this gives you a proper JSON array as you mentioned.
  • Readability: Renamed some variables (like data to item) to avoid confusion, and added indentation for clarity.

内容的提问来源于stack exchange,提问作者JAXPAROW95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:54:11