La codificación de caracteres juega un papel importante en la interpretación del contenido de un documento HTML y XML. Un documento no solo contiene caracteres ingleses sino también caracteres no ingleses como hebreo, latín, griego y mucho más. Para que el analizador sepa qué método de codificación debe usarse, los documentos contendrán una etiqueta y un atributo dedicados para especificarlo. Por ejemplo:
En documentos HTML
<meta charset=”–nombre del método de codificación–” content=”text/html”>
En documentos XML
<?xml version=”1.0″ encoding=”–nombre del método de codificación–“?>
Estas etiquetas transmiten al navegador qué método de codificación se puede usar para analizar. Si no se especifica el método de codificación adecuado, el contenido se procesa incorrectamente o, a veces, con el carácter de reemplazo ‘�’.
Métodos de codificación XML
Los documentos XML se pueden codificar en uno de los formatos que se enumeran a continuación.
- UTF-8
- UTF-16
- latín1
- US-ASCII
- ISO-8859-1 a ISO-8859-10
Entre estos métodos, comúnmente se encuentra UTF-8. UTF-16 permite 2 bytes para cada carácter y los documentos con ‘0xx’ se codifican con este método. Latin1 cubre caracteres de Europa occidental.
Métodos de codificación HTML
Los documentos HTML y HTML5 se pueden codificar mediante cualquiera de los métodos siguientes.
- UTF-8
- UTF-16
- ISO-8859-1
- UTF-16BE (Indio grande)
- UTF-16LE (pequeño indio)
- VENTANAS-874
- VENTANAS-1250 a VENTANAS-1258
Para documentos HTML5, se recomienda principalmente UTF-8. ISO-8859-1 se usa principalmente con documentos XHTML. Algunos métodos como UTF-7, UTF-32, BOCU-1, CESU-8 se mencionan explícitamente para no usarlos, ya que reemplazan la mayoría de los caracteres con el carácter de reemplazo ‘�’.
BeautifulSoup y codificación
El módulo BeautifulSoup, popularmente importado como bs4, es una bendición que hace que el análisis de HTML/XML sea pan comido. Tiene una gran cantidad de métodos entre los que uno ayuda a seleccionar contenidos por su nombre de etiqueta o por el atributo presente en la etiqueta, uno ayuda a extraer el contenido según la jerarquía, imprime contenido con la sangría requerida para HTML, y así sucesivamente. El módulo bs4 detecta automáticamente el método de codificación utilizado en los documentos y lo convierte a un formato adecuado de manera eficiente. El objeto BeautifulSoup devuelto tendrá varios atributos que brindan más información. Sin embargo, a veces predice incorrectamente el método de codificación. Por lo tanto, si el usuario conoce el método de codificación, es bueno pasarlo como argumento. Este artículo proporciona las diversas formas en que se pueden especificar los métodos de codificación en el módulo bs4.
codificación_original
El módulo bs4 tiene una sub-biblioteca llamada Unicode, Dammit que encuentra el método codificado y lo usa para convertir a caracteres Unicode. El atributo original_encoding se utiliza para devolver el método de codificación detectado.
Ejemplo 1 :
Dado un elemento HTML, analícelo y encuentre el método de codificación utilizado.
Python3
from bs4 import BeautifulSoup # HTML element with content h1 = b"<h1>Hello world!!</h1>" # parsing with html parser parsed = BeautifulSoup(h1, "html.parser") # tag found print("Tag foud :", parsed.h1.name) # the content inside the tag print("Content :", parsed.h1.string) # the encoded method print("Encoding method :", parsed.original_encoding)
Producción:
Aquí, la string del elemento HTML tiene el prefijo ‘ b ‘, lo que significa que se trata como un byte literal. Por lo tanto, el método de codificación ASCII es detectado y utilizado por el analizador. En situaciones del mundo real, la codificación original será la mencionada en el documento HTML
Ejemplo 2:
Dada una URL, analice los contenidos y encuentre el método de codificación original.
Python3
from bs4 import BeautifulSoup import requests URL = 'https://www.geeksforgeeks.org/python-update-nested-dictionary/' # request the page from server page = requests.get(URL) # parse the contentes of the page soup = BeautifulSoup(page.content, "html.parser") # encoded method print("Encoded method :", soup.original_encoding)
Producción
Encoded method : utf-8
Verificando la salida:
Python3
from bs4 import BeautifulSoup soup=BeautifulSoup(page.content,"html.parser") # fetching the <meta> tag's # charset attribute # of the content above tag=soup.meta['charset'] print("Encoding method :",tag)
Producción
Encoding method : UTF-8
from_encoding
Este es un parámetro que se puede pasar al constructor BeautifulSoup() . Esto le dice al módulo bs4 explícitamente qué método de codificación debe usarse. Esto ahorra tiempo y evita un análisis incorrecto debido a una predicción errónea.
Ejemplo :
Python3
from bs4 import BeautifulSoup # HTML element input = b"<h1>\xa2\xf6`\xe0</h1>" # parsing content soup = BeautifulSoup(input) print("Content :",soup.h1.string) print("Encoding method :",soup.original_encoding)
Si se genera la siguiente advertencia:
/usr/lib/python3/dist-packages/bs4/__init__.py:166: UserWarning: No se especificó explícitamente ningún analizador, por lo que estoy usando el mejor analizador HTML disponible para este sistema («html5lib»). Por lo general, esto no es un problema, pero si ejecuta este código en otro sistema o en un entorno virtual diferente, puede usar un analizador diferente y comportarse de manera diferente.
Para deshacerse de esta advertencia, cambie esto:
BeautifulSoup([su marcado])
a esto:
BeautifulSoup([su marcado], «html5lib»)
tipo_marcado=tipo_marcado))
Rastreo (llamadas recientes más última):
Archivo “/home/98e5f50281480cda5f5e31e3bcafb085.py”, línea 9, en <módulo>
imprimir(“Contenido:”,sopa.h1.string)
UnicodeEncodeError: el códec ‘ascii’ no puede codificar caracteres en la posición 0-1: ordinal no está en el rango (128)
El editor de GeeksforGeeks intentó analizarlo con ASCII y terminó con un error. El resultado de ejecutar el mismo código en la máquina local dio el siguiente resultado:
Pero el contenido en realidad corresponde a “ ISO-8859-8 ” y los caracteres interpretados no son los deseados. Por lo tanto, al mencionar explícitamente el método de codificación, si se conoce, se dará la salida correcta.
Python3
from bs4 import BeautifulSoup # HTML element input = b"<h1>\xa2\xf6`\xe0</h1>" # parsing content soup = BeautifulSoup(input, "html.parser", from_encoding="iso-8859-8") print("Content :",soup.h1.string) print("Encoding method :",soup.original_encoding)
Producción:
Codificación de salida
Cuando el contenido HTML analizado debe proporcionarse como salida, el módulo bs4 lo entrega de forma predeterminada como un documento codificado en UTF-8 o, a veces, con los mal previstos. Si desea que un documento sea codificado por otros métodos sin pasar al constructor, se puede hacer lo siguiente:
- prettify() : este método se usa para imprimir el contenido HTML con la sangría correcta. El método de codificación que se utilizará se puede pasar como un parámetro a este método, de modo que al imprimir también modifique el método de codificación.
Ejemplo :
Python3
# import module from bs4 import BeautifulSoup # HTML element input = b'''<html> <meta charset="iso-8859-8"/> <body> <h1>\xa2\xf6`\xe0</h1> </body> </html>''' # parsing content soup = BeautifulSoup(input,"html.parser") print(soup.prettify())
Producción:
Aquí puede ver la etiqueta <meta> donde la codificación se establece como UTF-8. Para evitar esto, se puede escribir de la siguiente manera.
Python3
from bs4 import BeautifulSoup # HTML element input = b'''<html> <meta charset="iso-8859-8"/> <body> <h1>\xa2\xf6`\xe0</h1> </body> </html>''' # parsing content soup = BeautifulSoup(input,"html.parser") print(soup.prettify("iso-8859-8"))
Producción:
b'<html>\n <meta charset="iso-8859-8"/>\n <body>\n <h1>\n \xa2\xf6`\xe0\n </h1>\n </body>\n</html>'
- encode() : el método de codificación se puede usar para pasar explícitamente el método requerido. Esto reemplaza los caracteres con las referencias XML correspondientes.
Ejemplo :
Python3
from bs4 import BeautifulSoup # HTML element input = b"<html><head></head><body><h1>\xa2\xf6`\xe0</h1></body></html>" # parsing content soup = BeautifulSoup(input) print("Content :",soup.h1.string) print("Encoding method :",soup.original_encoding) print("After explicit encoding :",soup.html.encode("iso-8859-8"))
Producción:
Publicación traducida automáticamente
Artículo escrito por erakshaya485 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA