Me pregunto cómo podría usar BeautifulSoup para analizar este estilo (¿javascript?) de atributos de etiqueta en el siguiente código html:
<div class="class1" data-prop="{personName: 'Claudia', personCode:'123456'}"> ... </div>Actualmente solo estoy siguiendo el proceso estándar hasta que llego al contenido del atributo que actualmente estoy analizando usando expresiones regulares, sin embargo, me gustaría saber si hay opciones mejores/más rápidas/más elegantes:
soup = BeautifulSoup(data,'html.parser') class_element = soup.find("div", class_="class1") data-props=class_element['data-prop'] # Parsing using regexp goes hereNo diría que este es un enfoque más rápido que regexp, pero probablemente requiere menos líneas de código:
Para convertir esta cadena en un dict de Python
data_props = "{personName: 'Claudia', personCode:'123456'}" data_as_dict_str = "dict(" + data_props[1:-1].replace(":", "=") + ")" print(eval(data_as_dict_str)) # {'personName': 'Claudia', 'personCode': '123456'} Si este atributo contiene código Python malicioso, ¡se ejecutará (en la eval )!
Y tampoco podemos usar el ast.literal_eval seguro, ya que no permitirá que se llame al nombre dict
Si queremos usar ast.literal_eval o json , entonces debemos transformar esta cadena de manera que todos los nombres tengan comillas y, en este punto, será más fácil usar solo expresiones regulares:
import re pattern = re.compile(r"(\b\w+\b)\s*:\s*'([^']+)'") data_props = "{personName: 'Claudia', personCode:'123456'}" print(dict(pattern.findall(data_props))) # {'personName': 'Claudia', 'personCode': '123456'}Si el problema es simplemente manejar claves sin comillas, puede usar la biblioteca hjson. No tengo idea acerca de las eficiencias internas, cómo se usa la expresión regular dentro del analizador, etc., pero es agradable y simple de usar en el nivel superior:
import hjson data = hjson.loads(soup.select_one('.class1')['data-prop'])