SCRAPPING con Python extrayendo Unicode para Criptografia!!! [Mini Curso Python EL DICCIONARIO]

Words
1287
Reading
6 min
Listen
Play
9y

Hola queridos amigos, hoy les traigo el código que vimos en la entrada anterior un poco mas explicado.

Por que necesitamos repasar el código?? sencillamente por que si queremos ser buenos programadores necesitamos leer y escribir mucho código, generalmente copiamos una parte de un código y puede que no funcione por que quizás nos falte alguna parte del mismo, nuestros sentidos debemos entrenarlos para saber que nos hace falta siempre esto lo logramos con practica leyendo código de otros que estén explicado linea a linea es una buena manera de Empezar.

Les recomiendo estos 2 libros:

  • Python para Informáticos.
  • Piensa como un Programador en Python.

Y también esta Pagina:

  • programarcadegames.com/index.php?lang=es

Aun hoy que trabajo programando como Freelancer me han ayudado a cimentar mis conocimientos.

Manos a la OBRA:

Este es nuestro link de nuestro proyecto: 

https://github.com/Seth-Root/Scrapping_tabla_unicode_y_criptografia

Tiene 2 archivos:

https://github.com/Seth-Root/Scrapping_tabla_unicode_y_criptografia/blob/master/lista_en.txt

https://github.com/Seth-Root/Scrapping_tabla_unicode_y_criptografia/blob/master/scraping_unicode.py

La primera es la lista que extrae el Script en caso de no existir nada en lista_en.txt y el segundo es el SCRIPT python.

Si quieren pueden descargarlo, lo colocan en una carpeta y lo ejecutan y ya tendrán el script funcionando.

Vamos a comentar un poco el SCRIPT para ver como hace lo que hace hasta ahora, recuerda linea a linea para ayudarles a programar mas y mejor en Python., recuerda que el código sin comentar esta aquí.

# -*- coding: utf-8 -*-

Codificamos en utf-8

import urllib2

Importamos esta librería para extraer contenido de urls con python

from bs4 import BeautifulSoup

Importamos BeautifulSoup para extraer los ingredientes que vamos a bajar, los ingredientes para mi son las etiquetas XML o html que encontraremos y BeautifulSoup nos permitirá interactuar o extraer cosas especificas.

import re

Importamos re que no es mas Expresiones Regulares, esto nos permitirá extraer datos exactos de algunas lineas o cadenas de caracteres.

import os, subprocess, re

Esto lo importamos para Linux, creo que en Windows debería funcionar de una manera parecida. Son las librerías del Sistema.

Ahora si se viene lo Bueno el script:

try:

El try except es usado para que un código se ejecute si todo esta bien y no se ejecute si hay algún error, con este método podemos decirle que tipos de errores podrían ocurrir pero ahora mismos tomamos try si funciona y except si falta algo o hay algún error general.

    f=open("lista_en.txt")

Aquí abrimos un archivo si existe, si no existe salta al except

    lista_bajada =  f.read()

Aquí leemos el archivo y se lo pasamos a la variable bajada

    f.close()

Aquí cerramos el archivo con close.

except:

Si pasa algo y no existe o no se lee el archivo caerá aquí, si lo que esta aquí contiene errores nos pintara un error grande en la consola.

    crear_LISTA_unicode = subprocess.call("touch lista_en.txt", shell=True)

Podemos ver que estamos usando subprocess y hacemos la llamada al sistema con call y ejecutamos : touch lista_en.txt como si en la shell estuviéramos shell=True

    f=open("lista_en.txt","w")

Ahora si existe el archivo pero si no existía lógicamente no debería tener nada, entonces lo abrimos para agregarle datos.

    lista_bajada =  f.read()

Leemos el archivo y los metemos en la variable lista_bajada

    f.close()

cerramos el archivo

if lista_bajada == False:

Ahora si, tenemos este condicional, si la lista contiene los datos para leer los valores no entramos aquí por que seria True, pero si es False procedemos a descargar esos datos que necesitamos.

    url_unicode = "https://www.sciencebuddies.org/science-fair-projects/references/table-of-8-bit-ascii-character-codes"

Esta es la URL que contiene la Tabla, la metemos en la variable url_unicode

    page = urllib2.urlopen(url_unicode)

Le pasamos url_unicode a urllib2 para abrir la url

    soup = BeautifulSoup(page, "lxml")

Pasamos toda la pagina a BeautifulSoup y hacemos el arreglo tipo lxml

    name_box = soup.find('div', attrs={'class': 'content-table page-break-avoid'}) 

Esta es la magia,  buscamos la etiqueta div que contiene la class 'content-table page-break-avoid'

    name_boxaaa = soup.find('table')  

Ahora metemos la tabla en la variable name_boxaaa

    table_headers = name_boxaaa.find_all('tr')

Procedemos a hacer uso de BeautifullSoup y creamos una lista de todas las tr que existen en la tabla que agregamos a la variable name_boxaaa.

    contable = 0

Esto es un contador

    lista_unicode = []

Creamos la lista lista_unicode

    for row in table_headers:

extraemos cada item de la lista de la table_headers, es decir cada fila de la columna.

    #if contable < 3:

La linea anterior no hace nada por q esta comentada, era simplemente para hacer corta la búsqueda.

        lista_unicode.append(str(row))

Agregamos las filas a la lista que creamos nueva, por que de otra manera encontraremos algunos errores extraños. Debido a los valores que no están tan bien codificados.

        contable +=1

contamos cuantos valores tenemos 

    print contable

imprimimos la cantidad de valores o filas extraídas

else:

Este else se refiere a si la lista_bajada o el archivo no esta vació, es decir si ya esta lleno

    contable = 0

Agregamos un contador por que me gusta saber que tengo todos los datos que baje

    lista_bajada = eval(lista_bajada)

Ahora abrimos la variable lista_bajada y con el método eval le decimos que revise si tiene alguna estructura de python como por ejemplo diccionario, tupla o lista, en nuestro caso es una lista lo que tenemos en el archivo lista_en.txt

    diccionario_unicode = {}

creamos un diccionario para emular una base de datos con diccionarios de Python, la magia de los Diccionarios es que cargan en la Memoria Ram por lo que es muy rápido extraer datos de ellos.

    for TRs in lista_bajada:

Ahora vamos a ver todos los TRs que existen y los vamos a ir imprimiendo esa es la imagen que coloque arriba

        contable +=1

Un contador me gusta tener contadores y prints por todos lados asi puedo verificar que el código hace lo que se quiere.

        print contable
        print TRs

Esto es la imagen la puedes ver al principio del POST

        TDs_por_cada_TR = re.findall('<td>([\S* ]+)</td>', TRs)

Esta linea es una de las mas importantes creamos una lista con los TDs que hay en los TRs.

        Lista_tds = []

Creamos una lista Lista_tds

        for TDs in TDs_por_cada_TR:

Entramos a la lista que creamos con expresiones regulares, podíamos colocar un condicional por si la lista esta vaciá.

            Lista_tds.append(TDs)

agregamos a la lista que creamos arriba cada TD

        if "&lt;" in TRs:

este condicional lo tenia que poner por que si, ya que este carácter da problemas y lo tuve que tratar muy aparte. Fijate en lo que hice:

            pop_despues= Lista_tds.pop(-1)

con pop eliminamos el elemento de una lista en este caso el ultimo, ya que -1 se refiere a el elemento desde el final al principio y en este caso la lista comienza en -1 al ser negativo. Por supuesto no hay -0

            Lista_tds.append("&lt;")

Agregamos el valor de menor que o "&lt;"

            Lista_tds.append(pop_despues)

ahora volvemos a agregar el elemento que sacamos, podíamos agregar el elemento por el numero de indice de la lista pero me gusta pop jajaja.

        print Lista_tds

imprimimos la lista para verificar y ir viendo un verbose o algo así.

        valor = Lista_tds[4]

ahora pasamos el valor o value a la variable valor.

        Lista_tds.pop(4)

ahora con pop sacamos esa variable que metimos en valor

        print Lista_tds

verificamos que se hizo

        print Lista_tds[4]

Esto es adorno para ver si funciono, en este punto daba error el "&lt;"

        diccionario_unicode[valor]= Lista_tds

ahora creamos los valores del diccionario, para cada valor la clave es la Lista a la que le eliminamos el valor.

        print " "
        print " "
print diccionario_unicode

Esto es adorno y es una lista bastante fea, la pueden comentar con #

print diccionario_unicode["A"]

Aquí vemos los valores de A en 

<td>Decimal</td>

<td>Octal</td>

<td>Hex</td>

<td>Binary</td>

Y una descripcion

<td>Description</td>

Esta es la salida para print diccionario_unicode["A"]:

['065', '101', '041', '0100 0001', '\xc2\xa0']

Para las siguientes entradas vamos a ver como quedarían algunas palabras codificadas en Binary o Hex o cualquiera de los arriba mencionados.

Feliz Día espero les haya gusta y haya sido de ayuda. 

Dios les Bendiga.

SCRAPPING con Python extrayendo Unicode para Criptografia!!! [Mini ... | Ecency