Codificación en BeautifulSoup

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *