Construir un motor de búsqueda.
Extrayendo el primer enlace. Como empezar – tu primer programa -
Rastreador web
Un rastreador web es un programa que recoge el contenido de la web. Un rastreador
web encontrará las páginas web partiendo de una página semilla y seguirá los enlaces
para encontrar otras páginas, y así sucesivamente, siguiendo los enlaces hasta que se
hayan encontrado muchas páginas web.
Este es el proceso que un rastreador web sigue:
Iniciar desde una página preseleccionada, que llamaremos pagina “semilla”.
Extraer todos los enlaces en esa página. (Esto es lo primero que
aprenderemos.)
Seguir cada uno de estos enlaces para encontrar nuevas páginas.
Extraer todos los enlaces de todas las nuevas páginas encontradas.
Seguir cada uno de estos enlaces para encontrar nuevas páginas.
Extraer todos los enlaces de todas las nuevas páginas encontradas.
...
Se mantiene el procedimiento en el tiempo mientras haya nuevas páginas que
encontrar, o hasta que es detenido.
Lo primero que haremos será escribir un programa para extraer el primer enlace de
una página web dada. Posteriormente, encontraremos la manera de extraer todos los
enlaces de una página web. Para a continuación, ver cómo mantener el rastreo sobre
muchas páginas.
Construir un motor de búsqueda.
Empecemos con un pequeño Quiz:
Quiz 1:
Escriba un programa Python que imprima el número de minutos en siete semanas.
Respuesta:
¿Por qué debemos aprender nuevos lenguajes, como Python, para programar
ordenadores, en lugar de utilizar los lenguajes naturales como el inglés o mandarín?
Hay muchas razones por las que un lenguaje como Python es mejor para escribir
programas que un lenguaje natural como el inglés. Un problema con los lenguajes
naturales es que son ambiguos. Por lo tanto, no todo el mundo va a interpretar la
misma frase de la misma manera. Para programar ordenadores, es importante que
sepamos exactamente lo que nuestros programas significan y de que el equipo va a
ejecutarlos con el significado que se pretendía. Otro problema con los lenguajes
naturales es que son muy detallados. Decir algo con el nivel de precisión necesario
para que un ordenador pueda seguirlo mecánicamente requeriría una gran cantidad de
trabajo. Queremos que los programas sean cortos, para que sean más fáciles de
escribir, leer y entender.
Gramática
En comparación con un lenguaje natural, los lenguajes de programación se adhieren a
una estructura gramatical estricta. En Inglés, incluso si una frase se escribe o habla
mal, todavía puede ser entendida con la ayuda del contexto o de otras pistas. Por otro
lado, en un lenguaje de programación como Python, el código debe coincidir con la
gramática del lenguaje exactamente. El intérprete de Python no tiene idea de qué
hacer con una entrada que no esté en el lenguaje Python, por lo que producirá un
error.
print 7 * 7 * 24 * 60
Construir un motor de búsqueda.
Reglas básicas de la gramática inglesa:
Sentence → Subject Verb Object
Subject → Noun
Object → Noun
Verb → Eat
Verb → Like
Noun → I
Noun → Python
Noun → Cookies
Cuando la gramática del lenguaje de programación no se sigue a rajatabla, el
intérprete devolverá un mensaje SyntaxError. Esto significa que la estructura del
código es inconsistente con las reglas del lenguaje de programación.
Forma Backus-Naur
La notación que se utiliza para describir la gramática, se conoce como Forma Backus-
Naur. Fue introducida en 1950 por John Backus, el principal diseñador del lenguaje de
programación Fortran en IBM.
El propósito de la Forma Backus-Naur es describir un lenguaje de programación de una
manera sencilla y concisa. La estructura de esta forma es:
La sustitución puede ser cualquier secuencia de cero o más no-terminales o
terminales.
Los terminales nunca aparecen en el lado izquierdo de una regla. Una vez que llegue a
un terminal no hay nada que pueda reemplazarlo. He aquí un ejemplo que muestra
cómo derivar una frase siguiendo las reglas de sustitución:
<Non-Terminal> → reemplazo
Construir un motor de búsqueda.
- Sentence → Subject Verb Object
→ Noun Verb Object
→ I Verb Object
→ I Like Object
→ I Like Noun
→ I Like Python
Hagamos otro Quiz.
Quiz 2:
¿Cuál de estas oraciones pueden ser producidas a partir de esta gramática, empezando
en Sentence?
o a. Python Eat Cookies
o b. Python Eat Python
o c. I Like Eat
Respuesta: a & b, siguen las reglas
Construir un motor de búsqueda.
Expresiones en Python:
Una expresión es algo que tiene un valor.
Estos son algunos ejemplos de expresiones en Python:
Aquí está una de las reglas de la gramática de Python para hacer expresiones:
La Expresión no-terminal que aparece en el lado izquierdo puede ser reemplazada por
una Expresión, seguida por un Operador, seguido por otra Expresión. Por ejemplo,
1 + 1 es: Expresión Operador Expresión.
¡Lo interesante de esta regla es que tiene Expresión en los lados izquierdo y derecho!
Esto parece circular, y sería, salvo que también existan otras reglas para Expresión que
no incluyan Expresión en el lado derecho.
Este es un ejemplo de una definición recursiva. Para hacer una buena definición
recursiva se necesitan al menos dos reglas:
1. Una regla que define algo en términos de sí mismo.
Expresión → Expresión Operador Expresión
2. Una regla que define esa cosa en términos de algo que ya sabemos.
Expresión → Número
Las definiciones recursivas son una idea muy poderosa en informática. Nos permiten
definir muchísimas cosas con unas cuantas reglas sencillas.
Estas son algunas de las reglas gramaticales de Python para expresiones aritméticas:
Expresión → Expresión Operador Expresión
Expresión → Número
Operador → +
Operador → *
Número → 0, 1, ...
3
1 + 1
7 * 7 * 24 * 60
Expresión → Expresión Operador Expresión
Construir un motor de búsqueda.
Aquí hay un ejemplo de derivación usando esta gramática:
Expresión → Expresión Operador Expresión
→ Expresión + Expresión
→ Expresión + Número
→ Expresión + 1
→ Expresión Operador Expresión + 1
→ Número Operador Expresión + 1
→ 2 Operador Expresión + 1
→ 2 * Expresión + 1
→ 2 * Expresión Operador Expresión + 1
→ 2 * Número Operador Expresión + 1
→ 2 * 3 Operador Expresión + 1
→ 2 * 3 * Expresión + 1
→ 2 * 3 * Número + 1
→ 2 * 3 * 3 + 1
Tenemos que añadir una regla más a nuestra gramática de Expresión para ser capaz de
producir todas las Expresiones que hemos utilizado hasta ahora:
Expresión → (Expresión)
Quiz 3: Expresiones Python
¿Cuál son Expresiones válidas de Python que se pueden producir a partir de Expresión?
Puede haber más de una.
a.3
b. ((3)
c. (1 * (2 * (3 * 4)))
d. + 33
e. (((7)))
Construir un motor de búsqueda.
Respuesta:
a. válido
b. no es válido, no se sigue la regla, Expresión -> (Expresión), tiene que tener () a
la derecha y a la izquierda
c. c. válido
d. no válido, no sigue Expresión -> Expresión Operador Expresión
e. válido, paréntesis anidados válidos, pero innecesarios
Sigamos adelante.
Empecemos con un Quiz.
Quiz 4: Velocidad de la Luz
Escribir código Python para imprimir hasta dónde viaja la luz en centímetros después
de un nanosegundo usando el operador de multiplicación.
La velocidad de la luz es 299792458 metros por segundo.
Un metro es 100 centímetros.
Un nanosegundo es una mil millonésima parte (1/1000000000) de segundo.
¿Por qué calcular esto? ¡Porque la distancia que la luz viaja en un nanosegundo
realmente importa en la informática! Un equipo típico de hoy ejecuta miles de
millones de pasos por segundo. El procesador que estoy usando es un procesador de
2,7 Ghz. GHz significa Gigahertz, o sea mil millones de ciclos por segundo. Así que, el
ordenador ejecuta 2700000000 ciclos por segundo.
Podemos entender que cada ciclo es equivalente a la ejecución de trozo muy pequeño
de una instrucción.
Respuesta:
>>> print 299792458 * 100 * 1.0/1000000000
29.9792458
Construir un motor de búsqueda.
Quiz 5: Variables
Teniendo en cuenta las variables que se definen a continuación, escribir código Python
que imprima la distancia, en metros, que la luz viaja en un ciclo del procesador.
Calcular dividiendo la velocidad de la luz por el número de ciclos por segundo.
Respuesta:
Quiz 6:
¿Cuál es el valor de segundos después de ejecutar este código?:
a. 0 b. 60 c. 120 d. Error
speed_of_light = 299792458 # metros por segundo
cycles_per_second = 27000000000. # 2.7 GHz
speed_of_light = 299792458 # meters per second
cycles_per_second = 27000000000. # 2.7GHz
print speed_of_light/ cycles_per_second
0.111034243704
minutos = minutos + 1
segundos = minutos * 60
Construir un motor de búsqueda.
Strings
Una cadena (string) es una secuencia de caracteres entre comillas, ya sean simples o dobles.
El único requisito es que la cadena debe empezar y terminar con el mismo tipo de comilla.
Esto le permite incluir comillas dentro de comillas como un carácter de la cadena.
Indexando Strings
Al hecho de seleccionar subcadenas de una cadena, se le llama indexación. Se utilizan
los corchetes [] para especificar qué parte de la cadena se desea seleccionar:
Por ejemplo, si tenemos el string 'universidad' y queremos seleccionar el carácter en la
posición cero (es decir, el primer carácter), escribiremos:
Las posiciones de una cadena se numeran empezando por 0, por lo que esta se evalúa
como 'u'.
'I am a string!'
"I prefer double quotes!"
"I'm happy I started with a double quote!"
<cadena> [<expresión>]
'universidad'[0]
'universidad'[0]
'u'
'universidad'[1 + 1]
'i'
nombre = 'Lupi'
nombre[0]
'L'
Construir un motor de búsqueda.
Cuando se utilizan números negativos en el índice, Python empieza a contar a partir
del final de la cadena:
O
Cuando intentas indexar un carácter en una posición donde no hay, Python produce un
IndexError lo que indica que el índice está fuera de rango:
nombre = 'Lupi'
print nombre[-1]
'i'
nombre='Lupi'
print nombre[-2]
'p'
nombre = 'Lupi'
print nombre[4]
IndexError: string index out of range
Construir un motor de búsqueda.
Quiz 6: mismo valor
Dada la variable,
¿Cuáles de estos pares tienen exactamente el mismo valor?
a. s[3], s[1+1+1]
b. s[0], (s+s)[0] c. s[0] + s[1], s[0+1] d. s[1], (s + 'ity') [1] e. s[-1], (s + s)[-1]
Respuesta:
a, b y e. Para c, la primera expresión es una cadena de dos caracteres, la segunda es la
cadena de un carácter de la letra en la posición 1. Para d, los resultados son los mismos
sólo si el valor de s contiene al menos dos caracteres. Por ejemplo, si s = 'a', la primera
expresión produce un error de indexación y la segunda expresión da salida 'i'.
Seleccionando Subcadenas
Se puede seleccionar una subcadena a partir de una cadena mediante la designación
de una posición inicial y una posición final. Python lee las posiciones empezando en 0,
por lo que la cadena 'universidad' tiene 11 caracteres, hay 11 posiciones: 0,1 ... 10,
con 'u' en la posición 0.
s = '<any string>'
<string>[<expression>] → un string de un carácter.
<string>[<start expression>:<stop expression>] → un string que es una subcadena del
string
Construir un motor de búsqueda.
Ejemplos
MIS NOTAS: INDEXAR CADENAS VACIAS
Al indexar una cadena que es vacía (es decir, cadena = ""), se aplican las siguientes reglas: donde # es un número cualquiera
word = 'assume'
print word[3]
'u'
print word[4:6]
'me'
print word[4:]
'me'
print word[:2]
'as'
print word[:]
'assume'
print cadena [#] -> produciría un ERROR
print cadena [:] -> produciría "" no es un error!
print cadena [#: #] -> produciría "" no es un error!
print cadena [- #: - #] -> produciría "" no es un error!
print cadena [#: - #] -> produciría "" no es un error!
print cadena [0:0] -> produciría "" no es un error!
Construir un motor de búsqueda.
Quiz 7:
Escriba el código Python que imprime Universidad (con una U mayúscula), teniendo en
cuenta la definición:
Respuesta:
Quiz 8:
Para cualquier string,
¿Cuáles de estas respuestas es siempre equivalente a s?
a. s[:]
b. s + s[0:-1 +1]
c. s[0:]
d. s[:-1]
e. s[:3] + s[3:]
Respuesta:
a, b, c, y e.
print 'U' + s[2: ]
Universidad
s= '<any string>'
s = 'auniversidad'
Construir un motor de búsqueda.
Encontrar subcadenas en cadenas
El método find es una operación o método incorporado siempre por Python, que opera
en strings. La salida de find es la posición de la cadena en la que se encuentra la
subcadena especificada.
.find()
Si la subcadena no se encuentra en cualquier parte de la cadena de búsqueda,
entonces la salida será -1.
Ejemplos
pythagoras = 'There is geometry in the humming of the strings, there is music in the spacing of the spheres. '
print pythagoras.find('string')
40
print pythagoras[40:]
'strings, there is music in the spacing of the spheres.'
print pythagoras.find('T')
0
print pythagoras.find('sphere')
86
print pythagoras[86:]
spheres.
print pythagoras.find('algebra')
-1
Construir un motor de búsqueda.
Quiz 9:
¿Cuál evalúa a -1?:
a. 'test'.find('t')
b. "test".find('st') c. "Test".find('te') d. 'west'.find('test')
Respuesta: c y d.
Quiz 10:
Para cualquier string
¿Cuál de las siguientes siempre será 0?
a. s.find(s)
b. s.find('s')
c. 's'.find('s')
d. s.find(' ')
e. s.find(s + '!!!') +1
Respuesta:
a. sí, no importa el valor de la cadena s, siempre vamos a encontrar s al principio de sí
misma.
b. no, la primera letra tiene que ser ‘s’
c. yes
d. yes
e. yes – la parte s.find(s + '!!!') siempre evalúa a -1, ya que nunca puedes encontrar un
string más largo que s en s. Sumándole 1 tendremos 0.
s = '<any string>'
Construir un motor de búsqueda.
Find con números
Además de pasar una cadena que queramos encontrar, también se puede pasar un
número:
find ( , )
Dicho número, es la posición en la cadena de búsqueda donde find comenzará a
buscar la cadena requerida. La salida es un número que nos dará la posición de la
primera aparición de la cadena buscada después de la posición de entrada (o justo en
esa posición). Si no existe la salida es -1
Por ejemplo:
ndanton = "De l'audace, encore de l'audace, toujours de l'audace."
print danton.find('audace')
5
print danton.find('audace', 0)
5
print danton.find('audace', 5)
5
print danton.find('audace', 6)
25
print danton.find('audace', 25)
25
print danton.find('audace', 48)
-1
Construir un motor de búsqueda.
Quiz 11: Find con números
Para s y t variables de tipo string, y i cualquier número.
¿Cuál de estas opciones es equivalente a s.find(t,i)?:
a. s[i: ].find(t) b. s.find(t)[ :i] c. s[i: ].find(t) + i d. s[i: ].find(t[i: ])
Respuesta:
¡Ninguna de las anteriores son equivalentes! Esta era una pregunta difícil. La opción c
es casi equivalente, excepto para el caso en que t no se encuentra en s [i:], y la salida
de la búsqueda será -1.
Extrayendo Enlaces:
Una página web es en realidad una larga cadena de caracteres. El navegador muestra
la página web de una manera que parece más atractiva que la simple cadena de
caracteres. Nosotros podemos ver la cadena de caracteres para cualquier página web
en el navegador. La forma de hacerlo depende del navegador que se esté utilizando.
Para Chrome y Firefox, hacer clic derecho en cualquier parte de la página que no sea
un enlace y seleccionar " Ver código fuente de la página". Para Internet Explorer, hacer
clic derecho y seleccione "Ver código fuente".
s = '<any string>'
t = '<any string>'
i = <any number>
Construir un motor de búsqueda.
Para nuestro rastreador web, lo importante es encontrar los enlaces a otras páginas
web en la página. Podemos encontrar esos vínculos mediante la búsqueda de las
etiquetas HTML que coincidan con esta estructura:
Por ejemplo, este es un enlace a la página anterior:
<a href="<url>">
<a href=http://xkcd.com/353/ />
Construir un motor de búsqueda.
Para construir nuestro rastreador, para cada página web queremos encontrar todos los
enlaces en dicha página. Queremos mantener esa información y seguir cada enlace
para encontrar más contenido en la web. Para esta unidad, vamos a hacer el primer
paso, que consiste en extraer la URL del primer enlace de la página. En la Unidad 2,
vamos a ver la forma de seguir adelante para obtener todos los destinos de los
enlaces, y en la Unidad 3, veremos cómo mantener control de los enlaces para poder
rastrear las páginas de destino. Por ahora, nuestro objetivo es coger el texto de
una Web y encontrar el primer enlace en dicho texto. Podemos hacer esto mediante
la búsqueda de la etiqueta de anclaje, <a href = ", y luego extraer de esa etiqueta la
URL que se encuentra entre las comillas dobles. Asumiremos que el contenido de la
página web está en una variable, page.
Quiz 12: Extraer Enlaces
Escribir código Python que asigne a la variable url, un string que sea el valor del enlace
que aparezca en la primera etiqueta de anclaje en el string contenido en la variable
page.
Recordemos
page= contenido página web
Usar
start_link=page.find(‘< a href = ‘)
Respuesta:
Para extraer la URL, necesitamos encontrar las comillas iniciales y finales y luego
extraer la sub-cadena de caracteres entre ellas.
Paso 1:
start_quote = page.find(' " ', start_link)
Recommended