the Programming Historian, parte III

Seguimos con la traducción de algunos capítulos del libro The Programming Historian, de William J. Turkel, Adam Crymble y Alan MacEachern.
Ahora vamos con el capítulo 5.

Del HTML a una lista de palabras


Quitando el formato HTML

A menudo estamos interesados en conservar el contenido textual de una fuente online para procesarla, pero para ello tenemos que deshacernos de las etiquetas y metadata HTML. Vamos a empezar haciéndolo de una manera rápida y desprolija. En el lenguaje HTML que vimos hasta ahora hay unos tipos básicos de etiquetas. Para quitar todas ellas parece seguro ignorar todo lo que esté entre un par de símbolos menor y mayor (< como apertura y > como clausura).


Nuestro algoritmo sera algo así:
1. Comenzar con una cadena (string) vacía (de nombre html para guardar nuestro texto en ella.
2. Mirar cada carácter en la cadena html, uno a uno.
3. Si el carácter es un signo menor (<) estamos entrando a una etiqueta por lo tanto ignoramos el caracter.
4. Si el carácter es un signo mayor (>) estamos abandonando una etiqueta.
5. Si estamos dentro de la etiqueta, ignoramos el carácter, de otro modo lo agregamos a la cadena de texto.
Un algoritmo es un procedimiento especificado en detalle que puede ser implementado por una computadora. Lo implementaremos ahora.
Más sobre cadenas en Python
Ya vimos que hay dos maneras de delimitar cadenas: usando comillas simples o dobles.

mensaje1 = 'hola mundo'
mensaje2 = "hola mundo"

Python posee un tercer tipo de cadena que admite múltiples líneas. Nos será útil más adelante.

mensaje3 = """hola
hola 
hola mundo"""

Python incluye muchos comandos para manipular cadenas de textos. Si quiere experimentar con esos comandos, puede escribir y ejecutar pequeños programas como hacemos nosotros, o bien puede abrirlos en la interfase de Python.

Algunas de las explicaciones en las siguientes secciones probablemente deban ser ampliadas un poco. Con ese fin puede consultarse la página de discusión del wiki.



Usted puede concatenar cadenas utilizando el operador de adición (+). Observe que debe ser explícito acerca de la cantidad y la ubicación de los espacios en blanco que desea en la cadena. También puede crear múltiples copias de cadenas usando el operador de multiplicación (*).

mensaje4 = 'hola' + ' ' + 'mundo'
print mensaje4
 
-> hola mundo
 
mensaje5a = 'hola ' * 3
mensaje5b = 'mundo'
print mensaje5a + mensaje5b
 
-> hola hola hola mundo

¿Y si quiere agregar sucesivamente material al final de cada cadena? Hay un operador especial para eso.

mensaje6 = 'hola'
mensaje6 += ' '
mensaje6 += 'mundo'
print mensaje6
 
-> hola mundo

Podemos determinar el número de caracteres de un cadena utilizando len. Observe que los espacios en blanco se cuentan como caracteres.

mensaje7 = 'hola' + ' ' + 'mundo'
print len(mensaje7)
 
-> 10

Finalmente, en algunas situaciones necesitará incluir comillas de distinto tipo en una cadena, y no querrá que el intérprete Python se haga una idea equivocada y finalice la cadena cuando se cruce con uno de esos caracteres. En Python, usted puede poner una barra inversa delante de un comilla para que indique que con ella no termina la cadena. Esas marcas son conocidas como secuencias de escape.

print '\"'
 
-> "
 
print 'El programa imprimió \"hola mundo\"'
 
-> El programa imprimió "hola mundo"

Otras dos secuencias de escape permiten imprimir tabulaciones y saltos de línea:

print 'hola<strong>\t</strong>hola<strong>\t</strong>hola<strong>\n</strong>mundo'
 
->hola     hola     hola 
mundo

Para volver a nuestro algoritmo, primero tenemos que crear una cadena vacía para poner el texto allí.

texto = ''

Ok, eso fue fácil. Sabemos como agregar caracteres en esa cadena cuando los necesitemos:

texto += char

Looping

Ahora necesitamos un modo de mirar cada carácter en la cadena html. Como muchos otros lenguajes de programación, Python incluye varios mecanismos de looping (bucles). El que queremos se llama bucle for. El ejemplo de abajo le dice al intérprete que haga algo por cada carácter en la cadena denominada html. En efecto, eso implica crear una cadena de un solo carácter bautizada char, la que contendrá cada carácter de la cadena html en sucesión.

for char in html:
    # aquí hacemos algo con char

Branching [condicionales]

Lo siguiente que necesitamos es un modo de testear los contenidos de una cadena y elegir un curso de acción en base a esa prueba. Otra vez, como muchos lenguajes de programación, Python cuenta con mecanismos de branching. La que usaremos más abajo se llama sentencia condicional if. Le pedimos que mire si la cadena char que le pasamos contiene un signo menor.

if char == '<':
    # hacemos algo

Un modo más común del condicional if nos permite especificar qué hacer si el test es falso.

if char == '<':
    # hacemos algo 
else:
    # hacemos algo distinto

En Python tenemos la opción de hacer tests supletorios luego del primero, usando el comando elif (que es una forma abreviada de else if).

if char == '<':
    # hacemos algo
elif char == '>':
    # hacemos otra cosa
else:
    # hacemos algo completamente diferente.

Para evitar confusiones, Python usa un signo igual simple (=) para asignar, que puede entender como establecer la igualdad de una cosa con cualquier otra. Con el fin de probar la igualdad usa el signo igual doble (==). A menudo los que recién comienzan a programar confunden ambos signos.
¿Cómo podemos saber cuándo estamos dentro de un tag del HTML? Podemos usar una variable numérica que llamaremos inside, la que será 1 (verdad) si estamos dentro de una ramificación y 0 (falso) si no lo estamos.

La rutina para quitar etiquetas de HTML

Para poner todo en un mismo paquete, la versión final de nuestra rutina se muestra más abajo. Copie ese código y péguelo en el Komodo. Guárdelo en un archivo llamado dh.py. Este archivo será el que contenga todo el código que nosotros queremos reutilizar. En otras palabras, dh.py es un módulo. (Más sobre esto puede hallarse en la página de discusión del wiki.)

# Dada una cadena que contiene HTML, remover todos los caracteres
# que se encuentren entre un signo menor y uno mayor, incluyendo
# esos signos.
 
def stripTags(html):
inside = 0
texto = ''
for char in html:
   if char == '<':
   inside = 1
   continue
elif (inside == 1 and char == '>'):
   inside = 0
   continue
elif inside == 1:
   continue
else:
   texto += char
return texto

Como puede leerse en el código, nos enteramos que necesitamos una orden más para hacer que el código funcione. El comando de Python continue le dice al intérprete que salte al inicio del bucle. Por lo que si el carácter es un signo menor quedará asentado que estamos dentro de una etiqueta y ahí mismo terminamos el procesamiento de ese carácter. Necesitamos, en ese punto, continuar con el siguiente en la cadena html antes que continuar procesando un carácter que ya clasificamos.

Listas en Python

Ahora que ya tenemos la habilidad de extraer texto crudo de las páginas web, lo que queremos es tener ese texto en una forma que sea fácil de procesar. Hasta aquí, cuando necesitábamos guardar información en nuestros programas en Python usábamos cadenas. Hubo un par de excepciones, de todos modos. En la rutina para quitar las etiquetas del HTML, también usamos un entero llamado inside que tomaba el valor 1 cuando procesábamos una etiqueta y 0 cuando no lo hacíamos (más información en la página de discusión del wiki).

inside = 1

Y, por otro lado, para leer o escribir en un archive nosotros usamos un manejador de archivo especial al que le pusimos f en el ejemplo de más arriba.

f = open('holamundo.txt','w')
f.write('hola mundo')
f.close()

De todos modos, uno de los tipos más usados de objetos que Python provee es la lista, una colección ordenada de otros objetos (incluidas, potencialmente, otras listas). El hecho de que las listas pueden contener listas hace que sean ideales para almacenar estructuras de tipo árbol, algo que explicaremos pronto y sobre lo que volveremos repetidamente. Es muy simple convertir una cadena a una lista de caracteres o una lista de palabras, como muestra el siguiente programa. Lo copiamos al Komodo, lo guardamos como cadena-a-lista.py y lo ejecutamos. Compare las dos listas que serán impresas en el panel de salida del Komodo.

# cadena-a-lista.py
 
# algunas cadenas
s1 = 'hola mundo'
s2 = 'Que tal mundo'
 
# lista de caracteres
charlist = []
for char in s1:
    charlist.append(char)
print charlist
 
# lista de 'palabras'
wordlist = s2.split()
print wordlist

La primera rutina usa un bucle for para tomar un caracter por vez de la cadena s1 y agregarlo appends al final de la lista llamada charlist. La segunda rutina hace uso del método split para quebrar la cadena s2 allí donde tiene espacios en blanco (espacios, tabulaciones, retorno de párrafo y caracteres similares). A decir verdad, es una simplificación llamar a los objetos de la segunda lista “palabras”. Trate cambiando s2 en el programa de arriba por ‘Qué tal mundo!’ y ejecútelo nuevamente. ¿Qué pasa con el signo de admiración?
Dado que aprendió tanto, usted puede ahora abrir una URL, bajar la página web a una cadena, quitarle las marcas HTML y luego dividir el texto en una lista de palabras. Pruebe ejecutando este programa:

# html-a-lista-1.py
 
import urllib2
import dh
 
url = 'http://niche.uwo.ca/programming-historian/dcb/dcb-34298.html'
 
response = urllib2.urlopen(url)
html = response.read()
texto = dh.stripTags(html)
wordlist = texto.split()
print wordlist[0:120]

Debería haber obtenido lo siguiente:

['Dictionary', 'of', 'Canadian', 'Biography', 'DOLLARD', 'DES', 
'ORMEAUX', '(called', 'Daulat', 'in', 'his', 'death', 'certificate', 
'and', 'Daulac', 'by', 'some', 'historians),', 'ADAM,', 'soldier,',
'\x93garrison', 'commander', 'of', 'the', 'fort', 'of', 
'Ville-Marie', '[Montreal]\x94;', 'b.', '1635,', 'killed', 'by', 
'the', 'Iroquois', 'at', 'the', 'Long', 'Sault', 'in', 
'May&nbsp;1660.', '\xa0\xa0\xa0\xa0\xa0', 'Nothing', 'is', 'known', 
'of', 'Dollard\x92s', 'activities', 'prior', 'to', 'his', 'arrival', 
'in', 'Canada', 'except', 'that', '\x93he', 'had', 'held', 'some', 
'commands', 'in', 'the', 'armies', 'of', 'France.\x94', 'Having', 
'come', 'to', 'Montreal', 'as', 'a', 'volunteer,', 'very', 
'probably', 'in', '1658,', 'he', 'continued', 'his', 'military', 
'career', 'there.', 'In', '1659', 'and', '1660', 'he', 'was', 
'described', 'as', 'an', '\x93officer\x94', 'or', '\x93garrison', 
'commander', 'of', 'the', 'fort', 'of', 'Ville-Marie,\x94', 'a', 
'title', 'that', 'he', 'shared', 'with', 'Pierre', 'Picot\xe9', 
'de', 'Belestre.', 'We', 'do', 'not', 'however', 'know', 'what', 
'his', 'particular', 'responsibility', 'was.']

Pero con tener una lista de palabras no lograremos mucho. Tendremos que hacer que nuestros programas puedan procesarla.

contratapas raras, contratapas malas


Trampa 22

Quería leer Trampa 22 (Catch-22) de Joseph Heller desde hace rato. Encontré un ejemplar, lo compré.
La novela es imperdible. Pero el ejemplar que compré (de la editorial RBA Libros, 2007) es también impar.
En la tapa y en el lomo dice que el libro es de Joseph Heller (bien), en el frontis la cosa cambia y Trampa 22 se le atribuye a Joseph Keller. Este Keller, según la wikipedia, es un matemático conocido por su teoría geométrica de la difracción.
En la contratapa el panorama se enrarece aún más. Allí se dice que el libro fue escrito por Val McDermid. Este sí es un escritor. Según su página web publicó recientemente The Fever of the Bone, y hasta donde leí, nunca publicó una novela que se llama Trampa 22 o fue teniente de las fuerzas aéreas estadounidenses en Córcega (como aparentemente sí fue Heller y/o Keller).
Se trata de dos o tres errores o dos o tres casos de suplantación de identidad. Es entendible.
Lo que no es para nada comprensible es el resumen de la novela en la contratapa.
Se me ocurrió que podría hacerse (¿o ya está hecho?) un cuaderno o un blog con las más increíbles (por peores o extravagantes) reseñas de contratapa jamás leídas. La de esta edición de Trampa 22 es parte de esa lista imaginaria, y lo es por mala.

quotep

La acción se desarrolla durante los últimos mese de la Segunda Guerra Mundial y se centra en una escuadrilla de bombarderos estadounidense. El coronel Cathcart, jefe de la cuadrilla, quiere ser ascendido a general. Y no encuentra mejor manera que enviar a sus hombres a realizar las misiones más peligrosas.
Con una lógica siniestra, Yossarian, un piloto subordinado de Cathcart que intenta ser eximido del servicio alegando enfermedad mental, recibe por respuesta que sólo los locos aceptan misiones aéreas y que su disgusto demuestra que está sano y, por tanto, es apto para volar. La evolución psicológica de Yossarian refleja la aguda crítica que hace Joseph Heller de un patriotismo mal entendido, que exige sacrificios inadmisibles.



En la página web de la editorial RBA, el asunto se arregla un poco con una oración que allí aparece pero en el libro no.
¿Quién conoce otros casos para la lista?

1936, la revolución española


The Ex, 1936



The Ex es un banda holandesa con muchos años encima (en su sitio se los ve patinando en el hielo, pero este disco es anarcopunk, en serio). Originalmente,1936, The Spanish Revolution fueron dos simples y un libro bilingüe (que no tengo) de 144 páginas, con fotos vistas y otras inéditas de los archivos de la CNT y la FAI, producido en conmemoración de los 30 años de la "revolución española". Después hubo versiones en CD, los temas se pueden escuchar en la red, varias fotos circulan, pero el libro no aparece fácilmente. Así que vamos viendo y escuchando estas versiones extrañas del tren blindado y ay carmela. Todo el paquete es una buena cosa.
Un googleo nos llevó hasta acá para ver algunas fotos y las letras de estos temas; hasta aquí para ver el diseño de los vinilos y más fotos; y hasta más allá para una buena cantidad de fotos. Hay un archivo bittorrent con los temas y las fotos (al parecer todas)…¿alguien leyó el libro?

Disco 1
They Shall Not Pass
El Tren Blindado

Disco 2
Ay Carmela
People Again


The Ex, tren blindado

coda: las fotos las bajé de aquí.

the Programming Historian, parte II

Seguimos con la traducción de algunos capítulos del libro The Programming Historian, de William J. Turkel, Adam Crymble y Alan MacEachern.
Ahora vamos con el capítulo 4.

Haciendo uso de sus capacidades para una lectura atenta

Desde ahora, vamos a ver más y más ejemplos de código. Trate de crearse el hábito de leer cada uno muy bien, de mismo modo en que lee una importante fuente primaria. Si hay algo en el código que nunca vio antes o no comprende, trate de hacer una hipótesis explícita acerca de cómo debe funcionar. A veces, su hipótesis será correcta y otras no, pero es mucho más fácil hacer progresos si es consciente de sus conjeturas. Ese es también el modo que deberá asumir cuando comience a corregir errores (debug) de programas que no funcionan. Una de las ventajas que tienen los historiadores tienen cuando se ponen a programar es que ya están habituados a la interrogación de fuentes en lugar de tomarlas en sentido literal.

Enviando información a archivos de texto

En las secciones previas, vimos cómo enviar información al panel “Command Output” (panel de salida) del editor Komodo, al utilizar el comando de Python print.

print 'hola mundo'

El lenguaje de programación Python es orientado a objetos. Esto quiere decir que está construido alrededor de un tipo especial de entidad, un objeto, que contiene tanto datos como un número de métodos para acceder y procesar esos datos. En el ejemplo de arriba, vemos un tipo de objeto, la cadena (string) hola mundo. Un objeto cadena es una secuencia de caracteres; aprenderemos más sobre métodos de cadenas pronto. Print es un comando que imprime objetos de modo textual.
Usará print en los casos donde quiera crear información que necesita de inmediato. A veces, de todos modos, usted creará información que quiera guardar, enviar a alguien más, o usar como “input” para ulteriores procesamientos por otros programas o grupos de programas. En esos casos usted querrá enviar información a archivos en su disco duro en lugar de hacerlo al panel “Command Output”. Ingrese el siguiente programa en la ventana principal del Komodo y guárdelo como arch-salida.py

# arch-salida.py
f = open('holamundo.txt','w')
f.write('hola mundo')
f.close()

En ese programa f es un objeto archivo, y open, write y close son métodos de archivos. En el método open, holamundo.txt es el nombre del archivo que usted está creando, y el parámetro w dice que usted está abriendo ese archivo en modo escritura (write). Note que tanto el nombre del archivo como el parámetro son cadenas en este caso. Su programa escribe el mensaje (otra cadena) en el archivo y luego lo cierra. (Para más información sobre estas órdenes, ver la sección File Objects en la Librería de Referencia Python.)
Haga doble click en el botón “Run Python” para ejecutar el programa. Aunque nada se imprima en el panel “Command Output”, puede ver un mensaje de estado que dice [en Windows] 'C:\Python25\Python.exe arch-salida.py' returned 0. Esto significa que su programa fue ejecutado con éxito. Si usa File->Open->File en el editor Komodo, puede abrir el archivo holamundo.txt. Este deberá contener su mensaje de una línea:

hola mundo

Puesto que los archivos de texto incluyen un mínimo monto de información de formato, ellos tienden a ser pequeños, fáciles de intercambiar entre plataformas diferentes (i.e, desde Windows a Linux o Mac o viceversa), y fáciles de enviar de un software a otro. Además, pueden ser usualmente leídos por quienes tengan un editor de texto como el Komodo.

Obteniendo información desde archivos de texto

Python tiene además comandos que le permiten obtener información desde archivos. Tipee el siguiente programa en el Komodo y guárdelo como arch-entrada.py. Cuando lo ejecute haciendo doble click en “Run Python”, abrirá el archivo de texto, leerá el mensaje de una línea e imprimirá el mismo mensaje en el panel “Command Output”.

# arch-salida.py
f = open('holamundo.txt','r')
mensaje = f.read()
print mensaje
f.close()

En este caso, el parámetro r es usado para indicar que estamos abriendo un archivo para leerlo (read). Read es otro método de archivo. El contenido del archivo (el mensaje de una sola línea) es copiado en mensaje, que es una cadena (string), y luego el comando print es utilizado para enviar el contenido de mensaje al panel de salida de Komodo.

Dividiendo código en módulos y funciones

A menudo querrá utilizar nuevamente un grupo de commandos, generalmente porque tiene una tarea que debe realizar una y otra vez. Supongamos, por ejemplo, que usted tiene que mantener todas sus referencias bibliográficas en Zotero y tiene una etiqueta que le indica cuáles necesita en su próximo viaje a la biblioteca. Resultaría muy útil tener un programa que seleccione sólo aquellos ítems etiquetados y los ordene por número topográfico.
Dado que eso forma parte de sus actividades de investigación, usted querrá tener disponible el programa para reutilizar en cada visita a la biblioteca. Un programa, en otras palabras, es un mecanismo para empaquetar una colección de comandos para facilitar su reutilización. Zotero mismo es un paquete de comandos útiles, como también lo es Firefox.
Cuando los programas son pequeños se guardan, generalmente, en un archivo único. Cuando quiere correr uno de esos programas, simplemente envía ese archivo al intérprete. Cuando los programas se hacen muy largos, tiene sentido dividirlos en archivos separados conocidos como módulos. Básicamente, la modularización permite a los programadores reutilizar código para tareas que realizan muchas veces. Más abajo, por ejemplo, puede ver que los comandos para trabajar con páginas web han sido puestos en un módulo de Python aparte. Python posee un comando especial, import que permite que un programa acceda a los contenidos de otro archivo de programa. (Como tendrá que trabajar con los ejemplos de más abajo, asegúrese de haber comprendido la diferencia entre cargar un archivo de datos (loading) e importar un archivo de programa (import).)
Hilando fino se puede decir que los programas están compuestos por rutinas que son potencialmente reutilizables. Estas son conocidas como funciones, y Python posee mecanismos que permiten definir nuevas funciones. Vamos a trabajar con un ejemplo muy simple de función y módulo. Supongamos que queremos crear una función con el propósito general de saludar personas. Copie la siguiente definición de función en el Komodo y guárdela como saludo.py. Ese archivo es su módulo.

# saludo.py
def saludogral (x):
    print "hola " + x

Advierta que la indentación es muy importante en Python. Los espacios en blanco antes del comando print le dicen al intérprete que eso es parte de una función que está siendo definida. Usted podrá aprender más sobre esto a medidas que avancemos. Por ahora, asegúrese de mantener la indentación tal como se lo mostramos.
Ahora puede crear otro programa que importe código desde su módulo y haga uso de él. Copie este código en el Komodo y guárdelo como usando-saludo.py. Este archivo es su programa.

# usando-saludo.py
import saludo
saludo.saludogral("a todos")
saludo.saludogral("programming historian")

Puede corer su usando-saludo.py con el commando Run Python que usted creó en el Komodo. Note que no puede correr su módulo…sólo puedo llamarlo desde su programa. (Como habrá podido advertir en este ejemplo y en los previos, las cadenas en Python pueden delimitarse con comillas simples o dobles. Es verdad.) Si todo va bien, usted verá:

hola a todos
hola programming historian

en el panel de salida del Komodo Edit.

Podemos pensar acerca de la “granularidad” del código de dos modos:
. De arriba hacia abajo. Si usted piensa en todas las cosas para las que quiere usar la computadora, puede descomponer el problema en recurrentes subproblemas. Necesita trabajar con archivos (sistema operativo), documentos (procesador de textos), números (planillas de cálculo), imágenes (programa de procesamiento de imágenes), páginas web (browser) y así sucesivamente. Cualquier programa deberá poder abrir, manipular y guardar archivos. Usted puede querer tener la capacidad para chequear la ortografía, puede querer requerir algún tipo de diccionario y la capacidad para buscar cada palabra en él. Buscar palabras implica estar en condiciones de comparar palabras letra por letra. Cada tarea puede ser dividida en otras más pequeñas.
. De abajo hacia arriba. Supongamos que usted comienza con una tarea simple, como sumar dos números entre sí (a+b). En cuanto aprenda a hacerlo, será posible generalizar su habilidad para sumar números entre sí (a+b)+c=(a+b+c). De la suma usted puede llegar a la multiplicación (a*3)=(a+a+a). Una vez que pudo convertir la suma de números en una útil función, puede recurrirse a esta constantemente. Su sistema operativo necesita de la adición para determinar cuánto espacio disponible existe en su disco rígido. Su procesador de texto necesita de la suma para mantener el conteo de las palabras y de las páginas, su planilla de cálculo necesitará mucho de la suma. Útiles “ladrillos” como los de la suma pueden ser combinados y recombinados a cualquier nivel de complejidad.

Acerca de las URLs

Una página web es un archivo que está guardado en otra computadora, una máquina conocida como servidor web. Cuando usted ‘entra’ a una página lo que en verdad sucede es que su computadora, el cliente, envía una petición al servidor que se encuentra en la red, y el servidor responde enviando una copia de la página solicitada a su máquina. Una manera de acceder a una página web con su browser es siguiendo un link de algún sitio. También puede, claro, pegar o tipear una Uniform Resource Locator (URL). La URL le dice a su browser dónde encontrar un recurso online especificándole el servidor, el directorio y el nombre del archivo que quiere recuperar, así como también el tipo de protocolo que el servidor y su browser podrán usar para intercambiar información (como HTTP, “Hypertext Transfer Protocol”). La estructura básica de una URL es

protocolo: //servidor : puerto /ruta ?consulta

Miremos algunos ejemplos.

http://niche.uwo.ca

El tipo más básico de URL simplemente especifica el protocolo y el servidor. Si le da esa URL a su browser, este le devolverá la página principal de sitio NiCHE. Lo que se asume es que la página principal de un determinado directorio se denomina index, a menudo index.html. El sitio NiCHE está escrito en un lenguaje distinto a HTML, pero de todos modos, el nombre de la página principal es index.php (PHP es otro lenguaje de programación web. Si le interesa conocer más sobre el mismo, hay un W3 Schools tutorial).
La URL también puede incluir un número de puerto. Sin entrar en demasiados detalles en este punto, el protocolo de red que soporta el intercambio de información en internet permite que las computadoras se conecten de distintas maneras. Generalmente, el puerto por defecto para HTTP es 80. La siguiente URL es equivalente a la primera:

http://niche.uwo.ca:80

Como sabemos, generalmente hay muchas páginas en un determinado sitio web. Ellas están guardadas en directorios del servidor, y usted puede especificar la ruta de una página en particular. La tabla de contenidos de este libro sigue la siguiente URL (note que no necesitamos mencionar el nombre de archivo ya que también en este caso es index.php.

http://niche.uwo.ca/programming-historian/

Finalmente, algunas páginas web permiten que ingresemos consultas. El sitio web NiCHE, por ejemplo, está dispuesto de tal manera que permite que solicitemos una página en particular usando una cadena de consulta. La siguiente URL nos lleva a la página principal de la infraestructura digital de NiCHE.

http://niche.uwo.ca/?q=node/12

Abriendo URLs con Python

Con el fin de cosechar y procesar automáticamente páginas web, necesitaremos poder abrir URLs con nuestros propios programas. El lenguaje Python incluye varios procedimientos para hacerlo.
Para dar un ejemplo, vamos a trabajar con un tipo de archivo que podemos encontrar cuando hacemos una investigación histórica. Digamos que usted está interesado en [N.T.: Este ejemplo lo ponemos nosotros porque el original tuvo problemas de acceso] Álvar Núñez Cabeza de Vaca, el inefable explorador y tremendo escritor. Con Google podemos localizar una entrada sobre Cabeza de Vaca en The Handbook of Texas Online.

Cabeza de Vaca



La URL para esa entrada es:

http://www.tshaonline.org/handbook/online/articles/CC/fca6.html

Mirando la página nos enteramos que hay una versión para imprimir de esa entrada:

Cabeza de Vaca



La URL es:

http://www.tshaonline.org/handbook/online/articles/CC/fca6_print.html

Cuando procesamos recursos de la web automáticamente a menudo resulta una buena idea trabajar con versiones para imprimir, ya que estas tienden a estar menos formateadas.
Ahora vamos a probar abrir la versión para imprimir de esa entrada. Copiamos el siguiente programa en el Komodo y lo guardamos con abrir-html.py. Cuando lo ejecutemos, el programa abrirá el archivo biográfico, leerá su contenido y lo guardará en una cadena de Python llamada por nosotros html y luego imprimirá los primeros trescientos caracteres de la cadena en el panel “Command Output” del Komodo. Use el comando View -> Page Source en Firefox para verificar que el código fuente HTML de la página es el mismo que el código que su programa recuperó. (Para conocer más sobre la librería urllib2, ver la biblioteca de referencia Python en esta sección.)

# abrir-html.py
import urllib2
url = ' http://www.tshaonline.org/handbook/online/articles/CC/fca6_print.html '
respuesta = urllib2.urlopen(url)
html = respuesta.read()
print html[0:300]

Guardando una copia local de una página web

Ya que usted sabe cómo escribir archivos, es fácil modificar el programa de arriba para que escriba el contenido de la cadena html en un archivo local en lugar de hacerlo en el panel “Command Output” del Komodo. Copie el siguiente programa en el Komodo, guárdelo como guardar-html.py y ejecútelo. Usando el comando File -> Open File en el Firefox, abra el archivo local que fue creado (‘fca6.html’) para confirmar que su copia es la misma que la copia online.

# guardar-html.py
import urllib2
url = ' http://www.tshaonline.org/handbook/online/articles/CC/fca6_print.html '
respuesta = urllib2.urlopen(url)
html = respuesta.read()
f = open('fca6.html', 'w')
f.write(html)
f.close

Entonces, si ya puede guardar un archivo tan fácilmente, ¿puede escribir un programa para bajar un montón de archivos? Puede aumentar las letras y los números del nombre de las páginas del Handbook, por ejemplo, y hacer sus propias copias de un montón de ellas. Sí. Ya lo veremos.

***

la autobiografía de Johnny Cash

Johnny Cash y Patrick Carr. Cash. La autobiografía de Johnny Cash, Barcelona, 2006, 315 páginas.
Cash



Conozco algunas personas que dicen haber leído varias veces el tomo uno de la autobiografía de Bob Dylan. Sin duda se trata de una exageración pero leyendo Cash…, la autobiografía a cuatro manos del cantante, estoy dispuesto a cambiar de opinión.
En la autobiografía de Dylan el personaje recupera sus pedazos, arrancándoselos a cada etapa, a cada período en el que él mismo decidió pensar su trayectoria. En la de Cash más de dos partes, de las cinco que integran el libro, están dedicadas a su gran familia, a sus casas, a la naturaleza que se respira en esas mansiones y a los gustos del personaje.
Hay algo, sin embargo, que emparenta los libros de Dylan y Cash: sus versiones del interior norteamericano. Ambos textos rememoran en su escritura la fuerza poiética que poseen dos adolescentes que llegan a las grandes ciudades, y de las que tienen mejores versiones que las que circulan en ellas. Son versiones de la ciudad aprendidas de la radio, en medio de trabajos pesados o fantásticos ocios. Esa es una historia que se respira muy bien en Cash… y que va apagándose a medida que el tiempo del escritor carcome la fuerza de los tiempos del cantante en el pasado. Es una fuerza que se lleva muy bien con los cincuenta y sesenta, y lo hace a la perfección con algunas sustancias. Pero en Cash… la pesada carga que el ascetismo deseado del escritor le impone al joven hiperquinético que rememora, nos aleja de todos los imaginarios posibles para una existencia que busca redención. En Cash… Perdón y Víctima matan a Determinación y Furia, y lentamente nos agotan.
Hay en Cash…: algunas perlas para exquisitos sapientes de la música de Johnny Cash; muy poco sobre la composición de sus temas, sobre la cocina de la canción; largas parrafadas de compromiso confesional; poca tensión entre sus ritmos de pastilla y nocturnidad y su dios benévolo. Sin embargo, pequeñas marcas sobre sus gustos musicales y anécdotas suyas y ajenas hacen de la composición algo por momentos llevadero, aún más porque el esqueleto de la obra no es cronológico. El ritmo no es suficiente para alcanzar las últimas páginas, y sólo la promesa de un resumen de la discografía de Cash nos sirve como impulso para terminar el último capítulo.
Estructurado en cinco moradas (sus casas, entre ellas la carretera), Cash… no abre demasiadas nuevas puertas a la música del cantante. Como he dejado quizás demasiado en claro, el libro no terminó de gustarme, pero muchas cosas de él, sí. La música de Johnny Cash casi obliga a la lectura de esta autobiografía un poco comercial, un poco inocua. Hay que ponerla en serie para salvarla del olvido. Con la de Dylan, que brilla con luz propia, sí, es posible; pero también con la música que le gustaba a Cash o con sus propias creaciones. En especial con los discos que él, hacia el final de su carrera, insistió en recuperar por conceptuales: Ride This Train, Bitter Tears.
En algún sentido, la autobiografía magnifica un desarreglo, y hace de Johnny Cash alguien que, queriendo apenas cantar gospel, debió asimilar sus nacimientos y renacimientos (algunos incluso muy lejanos a ese deseo primordial). O al menos así lo parece. Esa figura narrativa, que exaspera el desplazamiento de un destino de la realidad, produce un relato fragmentado y quebradizo para tratar de explicar los ciclos de una recepción y un reconocimiento multigeneracional. Hay obras increíbles urdidas con añicos.
Esta no es una de ellas.

the Programming Historian, parte I

Algo habíamos mencionado aquí en Tapera, hace algún tiempo, pero sin prestarle la atención debida. Bill Turkell detuvo "Digital History Hacks" -uno de los blogs más importantes en historia digital- pero casi al mismo tiempo comenzó a publicar un libro en formato wiki: The Programming Historian. (Los autores son William J. Turkel, Adam Crymble y Alan MacEachern. El libro se publica bajo el auspicio del departmento de historia de la University of Western Ontario y NiCHE: Network in Canadian History & Environment). El libro es una especie de tutorial políglota (utilizada distintos lenguajes, diferentes programas) para aprender a programar. Aunque por ahora su fuerte es Python. Python es un tremendo lenguaje de programación orientado a objetos, bastante intuitivo para, por ejemplo, trabajar con textos, pero también abierto y gratuito, y, además, poblado de librerías con funciones para distintas especialidades.
No sé qué tan útil resulta conocer cierto lenguajes de programación a los historiadores o a los cientistas sociales; supongo que mucho en la medida en que las bibliotecas son cada vez más digitales. Supongo que en el terreno de la docencia el conocimiento de estas lenguas posee un altísimo potencial. Lo cierto es que, en la actualidad, vendrían bien tutoriales sobre base de datos: muchísimas investigaciones encajan en ese género o trabajan con esa metodología, sin embargo mucho menos del 1% de esos trabajos nos dice cómo hicieron para procesar sus datos. Y esto no se debe al arte marcial de la economía narrativa; se debe a que sencillamente sus autores no lo saben. Pero sigamos con el Programming Historian, que está muy bueno.
La traducción que hacemos aquí es por pedazos y por cierto bastante precaria. Ojalá aprenda algún día.
Hay un índice, el punto 1 ("Acerca de este libro"),el punto 2 ("¿Es necesario aprender a programar?"). Nosotros vamos directo al punto 3,

Empezando

A fin de estudiar los métodos en este libro, necesitará bajar e instalar software de acceso libre. Tanto como se pueda, trataremos de hacer todo compatible con máquinas con Linux, Mac o Windows. Suponemos que la mayoría de nuestros lectores probablemente utilizan Windows, por lo que primero trataremos de que funcione bajo Windows XP, luego en Mac y finalmente bajo Linux. Estaremos complacidos en incluir instrucciones para plataformas específicas, especialmente si nos las envían. También incluiremos críticas y comentarios de pares en la página de discusión de secciones específicas. Pueden leerse esos comentarios clickeando la solapa discussion en el borde superior de esta y otras páginas wiki. Si tiene problemas con nuestras instrucciones o encuentra que algo no funciona en su plataforma, por favor avísenos.

Dado que es un trabajo muy en progreso, ocasionalmente haremos comentarios e indicaremos algunas cosas que son provisionales en color púrpura

.

Instrucciones para Windows XP [en el original hay instrucciones para Linux y Mac] * Haga un back up de su PC.
* Si aún no lo está usando, instale el browser Firefox.
* Instale las siguientes extensiones del Firefox
*Web developer toolbar
* Extension Developer’s Extension

Si está usando Firefox 3 no podrá instalar esta extensión por razones de seguridad. Saltee este ítem por ahora. Hay más información en la página de discusión

.
* Si todavía no lo usa, instale Zotero.
* Vaya al sitio de Python, baje la última versión estable del lenguaje de programación Python (versión 2.5.2 de abril de 2008) e instálela.
* Instale las siguientes librerías de Pyhton:
*Baje la última versión de Beatiful Soup y cópiela en el directorio de librerías de Python (usualmente C:\Python25\Lib).
* Instale Komodo Edit.
* Ejecute Komodo Edit. Verá algo así.



* Si no ve el panel Toolbox en el costado derecho, elija View –> Tabs –> Toolbox. No importa si el panel Project está abierto o no. Toma algo de tiempo familiarizarse con el diseño del editor Komodo. El archivo de Ayuda es bastante bueno.
* Ahora necesita configurar el editor para que pueda correr programas en Python.
* Elija Edit –> Preferences. Esto abrirá una nueva ventana de diálogo.
* Seleccione la categoría Python y establezca el 'Default Python Interpreter' (este suele ser C:\Python25\Python.exe).
* Si todo se ve como esto, haga un click en OK.



* Luego elija Toolbox –> Add –> New Command. Esto abrirá una nueva ventana de diálogo. Renombre su comando a “Run Python”. Bajo “Command”, use el menú de cascada para seleccionar

% (python) %f

Y bajo “Start in”, ingrese

% D

* Nota: Si olvida el %f en el primer commando, Python se colgará misteriosamente porque no recibirá un programa como entrada.
* Si todo se ve así, clickee en OK.



* Su nuevo comando aparecerá en el panel Toolbox.
Nota: Algunas personas han reportado que tuvieron que resetear la máquina antes de que Python pueda trabajar con Komodo.

'Hola mundo' en Python

Es tradición comenzar la programación en un nuevo entorno tratando de crear un programa que diga “hola mundo” y finalice. Para mantener nuestro acercamiento políglota a la programación, haremos eso de diferentes maneras, utilizando distintos lenguajes de progamación [N.T.: nosotros no lo haremos, esos desarrollos pueden seguirse en la versión original] Los lenguajes que utilizaremos son todos interpretados. Esto significa que hay un programa especial (conocido como intérprete) que sabe cómo seguir las instrucciones escritas en tal lenguaje. Una manera de usar el intérprete es guardar todas las instrucciones en un archivo y luego ejecutar al intérprete sobre ese archivo. Un archivo que contiene instrucciones de un lenguaje de programación es conocido como un programa. El intérprete ejecutará cada una de esas instrucciones que usted escribió en su programa y luego parará. Vamos a probar esto.
En Komodo, cree un nuevo archivo, ingrese las siguientes dos líneas de programación y guárdelas como hola-mundo.py

# hola-mundo.py
print 'hola mundo'

Entonces podrá hacer doble click en el botón “Run Python” -que usted creó en los pasos previos- para ejecutar su programa. Si toda va bien, podrá ver algo así:



Advierta que el resultado de su programa fue impreso en el panel “Command Output”.
Otro modo de interactuar con un intérprete es usarlo como lo que se conoce por Shell (interfase). Puede tipear una orden y presionar luego la tecla Enter, y el intérprete responderá a su comando. Usar una interfase es una buena manera de testear órdenes para asegurarse de que ellas hagan lo que usted piensa que harán.
Puede acceder a la interfase de Python haciendo doble click en C:\Python25\python.exe. Una nueva ventana se abrirá en su pantalla.
En la ventana de la interfase tipee:

print 'hola mundo'

y presione Enter . La computadora responderá con

hola mundo

Cuando representemos una interacción con la interfase, usaremos -> para indicar que la interfase respondió a su comando, como se muestra abajo:

print 'hola mundo'
-> hola mundo

En su pantalla esto se verá más o menos así:



La razón por la que nosotros usamos Python para muchas de nuestras tareas de programación es que Python es un lenguaje de muy alto nivel. Permite, en otras palabaras, escribir programas cortos y efectivos. Cuanto más corto el programa, más probable que este quepa en una pantalla, y de ese modo es más fácil hacer el seguimiento de la rutina.

***

Le siguen otras secciones que no traducimos: [haga copia de su trabajo][manténgase en contacto][otros recursos] y [lecturas recomendadas] La próxima sección es "Trabajando con archivos y páginas webs". Veremos cuándo está lista su traducción.