Python

Transfomar str a un formato de diccionario en python

Escrito por: Alejandro Hurtado Chacñama

data en formato de texto sin tratar

data = '{data:{feedback:{id:"ZmVlZGJhY2s6MTAxNjAyMzY4MzgwNzg4MzY=",is_eligible_for_real_time_updates:false,subscription_target_id:"10160236838078836",owning_profile:{__typename:"Page",id:"71263708835"},num_localized_comment_orderings:3,unfiltered_comment_count:{is_empty:false},comment_count:{total_count:1},i18n_comment_count:"1",url:"https://www.facebook.com/elcomercio.pe/posts/10160236838078836",i18n_reaction_count:"7",important_reactors:{nodes:[]},reaction_count:{count:7},reaction_display_config:{reaction_display_strategy:"NONE"},viewer_actor:null,viewer_feedback_reaction_info:null,i18n_share_count:"0",share_count:{count:0},share_fbid:"10160236838078836",reactors:{count:7,is_empty:false},top_reactions:{edges:[{reaction_count:6,node:{key:1,id:"1635855486666999",localized_name:"Me gusta",reaction_type:"LIKE"},i18n_reaction_count:"6"},{reaction_count:1,node:{key:2,id:"1678524932434102",localized_name:"Me encanta",reaction_type:"LOVE"},i18n_reaction_count:"1"}]},associated_video:null,video_view_count:null,video_view_count_reduced:null,total_video_posts:null,video_post_view_count:null,page_private_reply:null,seen_by_count:{count:null},comment_share_context:null,political_figure_data:null,associated_group:null,display_comments_count:{count:1},comments_disabled_notice:{ranges:[],text:"Se desactivaron los comentarios para esta publicación."},can_viewer_comment:false,comment_composer_placeholder:"Escribe un comentario…",toplevel_comment_count:{count:1},display_comments:{after_count:1,before_count:0,count:1,edges:[],is_initially_expanded:false,page_size:10,reply_comment_order:"RANKED_REPLIES",should_render_composer_preemptively:true,comment_order:"RANKED_THREADED",page_info:{end_cursor:null,has_next_page:true,has_previous_page:false,start_cursor:null}},can_viewer_react:false,supported_reactions:[{key:1,id:null},{key:2,id:null},{key:4,id:null},{key:3,id:null},{key:7,id:null},{key:8,id:null}],feedback_typers:{other_count:0},default_comment_ordering:"ranked_threaded",localized_comment_orderings:[{description:"Se muestran los comentarios de amigos y los que tienen más interacciones en primer lugar.",title:"Más relevantes",value:"RANKED_THREADED"},{description:"Se muestran todos los comentarios. Los comentarios más recientes aparecerán en primer lugar.",title:"Más recientes",value:"RECENT_ACTIVITY"},{description:"Se muestran todos los comentarios, incluido el posible spam. Los comentarios más relevantes aparecerán en primer lugar.",title:"Todos los comentarios",value:"RANKED_UNFILTERED"}]}},extensions:{is_final:true}}'

Como se puede apreciar el texto contiene una extructura de un formato como json, pero sin embargo no tiene ningún índice con comillas, por lo cual no es posible parsearlo directamente a un diccionario en python.

En esta ocación lo vamos a solucionar de dos formas.

1. Con expresiones regulares(solución óptima)

Lo puedes solucionar con re.sub

import re
result_data = re.sub(r'(?<=[{,])(\w+)(?=:)', r'"\1"', data)

result_data = json.loads(result_data)

Este patrón regex se descompone así:

(?<=[{,]): La palabra está precedida por los caracteres { o ,

(\w+): La palabra que buscamos. \w hace match con cualquier caracter unicode.

(?=:): La palabra está seguida de :

2. Utilizando replace python

Con esta opción unicamente identificamos todos los patrones para poder hacer un replace a todos los índices del diccionario de esta forma:

result_data = json.loads(data.replace('https:', '<----->').replace('{', '{"').replace(',',',"').replace(':', '":').replace(',"{', '{').replace('}{', '},{').replace('<----->', 'https:').replace('," ', ','))

Espero que sea de utilidad y si tienes alguna duda puedes dejar tu comentario aquí debajo.

blog comments powered by Disqus