如何将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
- Parse the raw date string: Use
datetime.strptime()to turn theDD-MM-YYYYstring into adatetimeobject. - Reformat to ISO 8601: Use
strftime()to convert that object back to a string inYYYY-MM-DDformat. - Add error handling: Optional but smart—wrap the date parsing in a
try/exceptblock 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/exceptblock 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
datatoitem) to avoid confusion, and added indentation for clarity.
内容的提问来源于stack exchange,提问作者JAXPAROW95
相关产品推荐
相关产品推荐

