import json from pathlib import Path from bs4 import BeautifulSoup def extract(markup): soup=BeautifulSoup(markup,'html.parser') records=[] def field_data(field): return {'pointer':field['data-field'],'label':field.get('data-label',''),'state':field['data-value-state'],'type':field.get('data-value-type','string'),'text':field.get_text()} for record in soup.select('.record[data-record-id]'): records.append({'id':record['data-record-id'],'fields':[field_data(f) for f in record.select('.field[data-field]:not([data-role])')], 'roles':{f['data-role']:field_data(f) for f in record.select('.field[data-role]')}}) return records def save(records,path): Path(path).write_text(''.join(json.dumps(r,ensure_ascii=False)+'\n' for r in records),encoding='utf-8')