Python Scraping NFL [Parte 1]

Al final decidí hacer la parte 1 de esta interesante serie, estamos bastante desfasados :S, pero esta semana creo que podre terminar esta serie hasta la parte del scraping… ya la parte del análisis espero tenerla este año, y sera para la próxima temporada que podremos usarla a tope… Hoy vamos a ver el codigo de como extraer los datos para cada juego, solo vamos a extraer los score de cada equipo por separado, ya luego podemos hacer un for para que nos los agrupe de 2 en 2 y asi saber a quien se enfrento cada equipo….

Aqui el codigo, aunque pienso cambiarlo un poco en como aplicar el get.TEXT, luego algun comentario del codigo:

import requests, urllib2
from bs4 import BeautifulSoup
import re

import math

lista_regular_season = [range(1, 6)]

### Pagina primaria para buscar los datos

url_1er = 'http://www.nfl.com/scores/2016/REG'
for semana in lista_regular_season[0]:
  
    print "      " 
    print "      " 

    print "      " 
    print "Que semana esta: ", semana 
    print "      " 
    print "      " 
    print "      " 

    url_1er = 'http://www.nfl.com/scores/2016/REG'+str(semana)
    
    print url_1er

    url_1er = 'http://www.nfl.com/scores/2016/REG'

            
    page_1era = urllib2.urlopen(url_1er)
            
    soup_1er = BeautifulSoup(page_1era, 'lxml')

    divicion_Diviciones = soup_1er.find_all('div',class_="new-score-box-wrapper" )
    
    quarters_total = soup_1er.find_all('p',class_="total-score" )
    if "--" in quarters_total:
      print "Este juego No se ha jugado"
      pass
    else:
      
      
        results_total = []
        results_first = []
        results_second = []
        results_third = []
        results_fourth = []
        nombres_equipos = []

        ### Total
        quarters_total = soup_1er.find_all('p',class_="total-score" )
        results_total.append([headers.get_text() for headers in quarters_total])
        results_total = results_total[0]


        ### nombre Equipo
        nombre_equipo= soup_1er.find_all('p',class_="team-name" )
        nombres_equipos.append([headers.get_text() for headers in nombre_equipo])
        nombres_equipos = nombres_equipos[0][2:]
        
        ### Primer cuarto
        first_qt = soup_1er.find_all('span',class_="first-qt" )
        results_first.append([data.get_text() for data in first_qt])
        results_first = results_first[0][2:]

        ### segundo cuarto

        second_qt = soup_1er.find_all('span',class_="second-qt" )
        results_second.append([data.get_text() for data in second_qt])
        results_second = results_second[0][2:]

        ### tercer cuarto

        third_qt = soup_1er.find_all('span',class_="third-qt" )
        results_third.append([data.get_text() for data in third_qt])
        results_third = results_third[0][2:]

        ### cuarto cuarto

        fourth_qt = soup_1er.find_all('span',class_="fourth-qt" )
        results_fourth.append([data.get_text() for data in fourth_qt])
        
        ## Debo cambiar la linea anterior para obtener 1 sola lista 😀
        results_fourth = results_fourth[0][2:]





        i = 0
        for datos in nombres_equipos:
                print "Nombre Equipo", datos
                primer_cuarto =  results_first[i]
                primer_cuarto =  int(primer_cuarto)
        

                segundo_cuarto = results_second[i]
                segundo_cuarto =  int(segundo_cuarto)

        
                tercer_cuarto =  results_third[i]
                tercer_cuarto =  int(tercer_cuarto)

        
                cuarto_cuarto =  results_fourth[i]
                cuarto_cuarto =  int(cuarto_cuarto)
                print "1er Cuarto:  ", primer_cuarto,"2do Cuarto:  " ,segundo_cuarto,"3er Cuarto:  ", tercer_cuarto,"4to Cuarto:  ", cuarto_cuarto
        

                total_total = primer_cuarto + segundo_cuarto +tercer_cuarto + cuarto_cuarto
                total = results_total[i]
                
                print "Total", total_total
        
        
        

                i += 1

No hay mucho que comentar solo que la pagina usada para extraer los datos es http://www.nfl.com/scores/2016/REG y se le agrega un numero que corresponde a la semana o jornada de la temporada…

También la linea data.get_text() debo modificarla para hacer el código mas viable 😀

Las otras partes son faciles de entender si has seguido mis entradas 😀

Hasta luego Feliz Dia y que Dios te Bendiga

Un Robot que mueve Archivos en Python + Bash

De verdad que es muy importante aprender mas cada día de nuestro trabajo pero en especial de Dios, recordemos que todo el conocimiento proviene de Dios la Sabiduría es el temor a Jehova o al Señor, y el Discernimiento es conocer Al Señor… por esto yo día a día busco a Dios y dice la palabra todas las cosas se te darán por añadidura, es decir el conocimiento y las fuerzas para hacer cada Día tu trabajo serán añadidos y se te harán mucho mas fácil y podrás hacer cosas que ni pensabas 😀

Les cuento que Tenia que probar en tiempo real que el ODOO v8 leía los documentos PNR de Sabre, en Openerp v7 solo implemente una clase que al ser creada leía los PNRs, luego se me pidió que colocara dicha función que leía los PNR en el planificador de tareas de ODOO v7, y bueno me encontré con algunos detalles que poco  a poco fui sorteando :D, al final todo funciono y tocaba hacer lo mismo en ODOO v8 y así lo hice, pero también debía agregar cada cierto tiempo algunos PNRs para estar seguros que ODOO estaba leyendo los PNRs apenas llegaban y ademas estar seguros que los PNRs una vez leídos eran pasados a otra carpeta para no perder tiempo en leerlos o si quiera contarlos nuevamente, aunque fueran segundos son importantes 😀

Por lo que se me ocurrió la idea de crear un programita que hiciera esa ardua tarea de mover archivos cada cierto tiempo de una carpeta a otra, al final pensé en como hacerlo y quedo así:

# -*- coding: utf-8 -*-
import os

import random

import subprocess

os.system("ls /home/usuario/emular_server_sabre/resspl >/home/usuario/emular_server_sabre/lista_archivos_resspl")

archi=open('/home/usuario/emular_server_sabre/lista_archivos_resspl','r')
    
lineas=archi.read().splitlines()
lista_definitiva = []
for linea in lineas:
      
    lista_definitiva.append(linea)
    

print lista_definitiva
    
archi.close()

while len(lista_definitiva) >= 20:
    numero_aleatorio= random.randrange(20)
    print len(lista_definitiva)
    
    for archivos in range(numero_aleatorio):
      
          numero_aleatorio_sacar= random.randrange(len(lista_definitiva))
          
          archivo_pnr = lista_definitiva[numero_aleatorio_sacar]
          archivo_a_mover = '/home/usuario/emular_server_sabre/resspl/'+ archivo_pnr
          subprocess.call(['mv', archivo_a_mover, '/home/usuario/emular_server_sabre/resspl_new'])
          
          lista_definitiva.pop(numero_aleatorio_sacar)
          
          print archivo_a_mover
          
    os.system("sleep 10")

          

Les comento algunas lineas, importamos os y subprocess, por que es mas cómodo trabajar la shell desde os algunas veces y otras desde subprocess, random para darle un poco de realismo entre comillas :D, lo primero que hacemos es leer la carpeta donde llegaran los PNRs y la pasamos a un archivo, dicho archivo lo leemos linea a linea y lo agregamos 1 a 1 con for a una lista, cerramos el archivo, luego creamos un bucle que mientras queden mas de 20 archivos se ejecute siempre, luego creamos un numero_aleatorio que sera la cantidad de archivos que pasaremos entre 0 y 20, luego creamos en el for un numero aleatorio esta ves para sacar los números de la lista, así vamos moviendo dicho archivo  otro directorio, y hacemos eso para el numero de veces definidas aleatoria-mente, luego esperamos 10 segundos y repetimos el proceso:

Esta podría ser la salida:


Quedan este numero de archivos: 442
/home/setnorac/emular_server_sabre/resspl/TNMLIR00.PNR
/home/setnorac/emular_server_sabre/resspl/CMQSJB00.PNR
/home/setnorac/emular_server_sabre/resspl/BBILYI00.PNR
/home/setnorac/emular_server_sabre/resspl/VKTKVL00.PNR
/home/setnorac/emular_server_sabre/resspl/ASFFGA00.PNR
/home/setnorac/emular_server_sabre/resspl/NZBTGI00.PNR
/home/setnorac/emular_server_sabre/resspl/DEGYFS00.PNR
/home/setnorac/emular_server_sabre/resspl/WFBUUR00.PNR
/home/setnorac/emular_server_sabre/resspl/TEDUYP00.PNR
/home/setnorac/emular_server_sabre/resspl/AQVSGF00.PNR
/home/setnorac/emular_server_sabre/resspl/WNNESL00.PNR
/home/setnorac/emular_server_sabre/resspl/EZTZAX00.PNR
Quedan este numero de archivos: 430
/home/setnorac/emular_server_sabre/resspl/ODGGSK01.PNR
/home/setnorac/emular_server_sabre/resspl/WZUSXY02.PNR
/home/setnorac/emular_server_sabre/resspl/QCCKUP00.PNR
/home/setnorac/emular_server_sabre/resspl/QRYXQJ00.PNR
/home/setnorac/emular_server_sabre/resspl/MLLHVX00.PNR
/home/setnorac/emular_server_sabre/resspl/LKJVCP00.PNR
/home/setnorac/emular_server_sabre/resspl/GNUNXP00.PNR
/home/setnorac/emular_server_sabre/resspl/ZZXVVX00.PNR
/home/setnorac/emular_server_sabre/resspl/ZSTHCV00.PNR
/home/setnorac/emular_server_sabre/resspl/LLIBLM00.PNR
/home/setnorac/emular_server_sabre/resspl/KJNDYN00.PNR
/home/setnorac/emular_server_sabre/resspl/CDAZSI00.PNR
Quedan este numero de archivos: 418
/home/setnorac/emular_server_sabre/resspl/USYRFJ00.PNR
/home/setnorac/emular_server_sabre/resspl/HRZUTH09.PNR
/home/setnorac/emular_server_sabre/resspl/KABKQK00.PNR
/home/setnorac/emular_server_sabre/resspl/WFIIEH00.PNR
/home/setnorac/emular_server_sabre/resspl/RBHQMX00.PNR
/home/setnorac/emular_server_sabre/resspl/ZJVGZF00.PNR
/home/setnorac/emular_server_sabre/resspl/SZKRTH00.PNR
/home/setnorac/emular_server_sabre/resspl/WKEIPW00.PNR
Quedan este numero de archivos: 410
/home/setnorac/emular_server_sabre/resspl/NTJHEC00.PNR
Quedan este numero de archivos: 409
/home/setnorac/emular_server_sabre/resspl/KCMOWH03.PNR
/home/setnorac/emular_server_sabre/resspl/IWMGLY00.PNR
/home/setnorac/emular_server_sabre/resspl/UIVSYI00.PNR
/home/setnorac/emular_server_sabre/resspl/JREMOQ00.PNR
/home/setnorac/emular_server_sabre/resspl/TCPTNN00.PNR
/home/setnorac/emular_server_sabre/resspl/EQZFFS00.PNR
/home/setnorac/emular_server_sabre/resspl/FFFSRL00.PNR
/home/setnorac/emular_server_sabre/resspl/ZAKAMO01.PNR
/home/setnorac/emular_server_sabre/resspl/GWOYGO00.PNR
Quedan este numero de archivos: 400
/home/setnorac/emular_server_sabre/resspl/FTYBXG00.PNR
/home/setnorac/emular_server_sabre/resspl/GGSFVQ00.PNR
/home/setnorac/emular_server_sabre/resspl/YRYHQE00.PNR
/home/setnorac/emular_server_sabre/resspl/GVGEHA00.PNR
/home/setnorac/emular_server_sabre/resspl/EOUVSS00.PNR
/home/setnorac/emular_server_sabre/resspl/VDZGUO00.PNR
/home/setnorac/emular_server_sabre/resspl/ZKVDFB00.PNR
/home/setnorac/emular_server_sabre/resspl/WBEPNT00.PNR
/home/setnorac/emular_server_sabre/resspl/RYPPFK00.PNR
/home/setnorac/emular_server_sabre/resspl/VEWSTU00.PNR
/home/setnorac/emular_server_sabre/resspl/FFWFZB00.PNR
/home/setnorac/emular_server_sabre/resspl/BGDXGH00.PNR
/home/setnorac/emular_server_sabre/resspl/UZEDKC00.PNR
Quedan este numero de archivos: 387
Quedan este numero de archivos: 387
/home/setnorac/emular_server_sabre/resspl/EIGPDE00.PNR
/home/setnorac/emular_server_sabre/resspl/OJWCOC00.PNR
/home/setnorac/emular_server_sabre/resspl/DDCMEX00.PNR
/home/setnorac/emular_server_sabre/resspl/DKTGPP00.PNR
/home/setnorac/emular_server_sabre/resspl/AEJHFG00.PNR
/home/setnorac/emular_server_sabre/resspl/TGHKIK00.PNR
/home/setnorac/emular_server_sabre/resspl/DRKFSS00.PNR
Quedan este numero de archivos: 380
/home/setnorac/emular_server_sabre/resspl/KELLQI00.PNR
/home/setnorac/emular_server_sabre/resspl/OGGFZL00.PNR
/home/setnorac/emular_server_sabre/resspl/YUVINL00.PNR
/home/setnorac/emular_server_sabre/resspl/TAPXAA00.PNR
/home/setnorac/emular_server_sabre/resspl/EEMYZM00.PNR
/home/setnorac/emular_server_sabre/resspl/EBJWPM00.PNR
/home/setnorac/emular_server_sabre/resspl/STJHUE00.PNR
/home/setnorac/emular_server_sabre/resspl/EMSWIR00.PNR
/home/setnorac/emular_server_sabre/resspl/KPPWGH00.PNR
/home/setnorac/emular_server_sabre/resspl/FMFAYL00.PNR
/home/setnorac/emular_server_sabre/resspl/OJGBZT00.PNR
/home/setnorac/emular_server_sabre/resspl/DQKLJH00.PNR
/home/setnorac/emular_server_sabre/resspl/EHUKQF00.PNR
/home/setnorac/emular_server_sabre/resspl/CFGMKG00.PNR
/home/setnorac/emular_server_sabre/resspl/VXKOPK00.PNR
/home/setnorac/emular_server_sabre/resspl/YZHXZQ00.PNR
/home/setnorac/emular_server_sabre/resspl/QYOLSD00.PNR
/home/setnorac/emular_server_sabre/resspl/MSTWAM00.PNR
Quedan este numero de archivos: 362
/home/setnorac/emular_server_sabre/resspl/BJEIWS00.PNR
/home/setnorac/emular_server_sabre/resspl/RPXTNN00.PNR
/home/setnorac/emular_server_sabre/resspl/ETWBCA00.PNR
/home/setnorac/emular_server_sabre/resspl/UBUIYY00.PNR
/home/setnorac/emular_server_sabre/resspl/NEMIQT00.PNR

Y bueno en realidad no hace mucho pero nos puede dar muchas ideas de uso 😀

Ya subi el video a Youtube mañana lo subo al blog 😀

Feliz Día que Dios les Bendiga y les Llene de Gozo….

Planificación de Tareas desde Openerp v7 (ODOO) ir_cron

Me disculpan que no he subido el vídeo de PNRs Sabre con ODOO, pero es que he estado bastante ocupado con el Trabajo que estoy haciendo para la AeroLinea esta(aunque no directamente, soy freelancer)…

Hoy les vengo a contar que después que cree, el modulo que lee los PNRs que imprime el software SABRE, para la segunda Fase tengo que hacer que todo sea automático, es decir que con el modulo ir_cron de ODOO se ejecute la lectura de los PNRs y se vacié en las clases correspondientes, lo segundo ya estaba hecho lo primero no, me pareció muy sencillo pero tiene su truco, como todo en ODOO 😀

Al principio pensé que correría directamente en el planificador colocando los datos del objeto y el método a llamar, pero me equivoque y me daba este error(ojo corte el error pero básicamente eso dice):

openerp.addons.base.ir.ir_cron: Call of  create TypeError: create() takes at least 4 arguments (3 given)

Y ahora que hago el Botón si esta funcionando pero el planificador no quería leer mi código :S… Buscando en internet y leyendo ayudas con respecto a este tema me encontré con varias y son de las que vamos a hablar aquí, creo que si llegaste aquí es por que tienes algún error de los que vamos a hablar… por eso no colocare el código completo 😀

  • El error me dice estas pasando 4 argumentos mientras que la llamada a create del planificador necesita 3.
def run_actions(self, cr, uid, ids, context=None):

Así mas o menos tenemos nuestra función definida, les cuento que no hay nada de malo para un botón, pero si lo que queremos es pasársela al planificador solo debemos eliminar “ids” de los argumentos que estamos pasando y ya funcionara 😀

def run_actions(self, cr, uid, context=None):

Por otra parte si quieres saber exactamente como hacer una función para ser llamada por el planificador aquí te dejo este enlace

Ademas si quieras ir un poco mas allá no dejes de leer esto

En un rato o mañana voy a subir un código en python que esta muy interesante, que tuve que hacer para simular la llegada de archivos PNRs a el servidor que las procesa, para cambiarlas de Directorio(carpetas) donde llegan a un directorio de Procesados, no es mucho pero es interesante las formas que tenemos de embeber código Shelscript en Python

Voy a ir subiendo los vídeos a ver si algún día suben :S

 

 

Sabre + ODOO pasando datos de Archivos PNR a ODOO

Luego de Hablarle a el cliente me dio permisos de subir un vídeo de como funciona el ODOO en conjunto con SABRE…

odoo_sabre

SABRE es un sistema operativo de procesamiento en tiempo real (RT TPOS) centralizado, desarrollado por American Airlines e IBM. segun

Este sistema es usado por las AeroLineas para administrar todo lo que tiene que ver con La Venta de Pasajes, y bueno ya que este es un sistema cerrado muchas AeroLineas han migrado a ODOO no es la primera vez que escucho de ODOO y AeroLineas, por hay me contacto alguien para este mismo tema hace varios meses y me dejo como novia de pueblo jajaja, sin rencores…. Aprovecho para decir que estoy a la Orden para cualquier Reto en los siguientes temas:

  • Migracion y adaptacion de Bases de Datos  a ODOO, siempre que la Base de datos este en sistemas legibles por ejemplo que se puedan pasar a CSV de alguna manera…
  • Scraping desde Python a cualquier Pagina, adecuación de los datos a Bases de Datos y Creacion de APIs a partir de los datos recolectados, tampoco soy mago
  • Scraping desde ODOO, bueno eso 😀

Siguiendo con el tema, esto lo hice en una semana, aunque los 3 primeros días fueron una tortura por que no sabia que era un archivo PNR, luego fui leyendo la documentación que casi no existía, en realidad tuve que leer el código de otros, tenían una API que al final nunca supe por que no funcionaba , eran muchos códigos, scripts y mucha configuración… al final recree las condiciones de la API en ODOO directamente(en la próxima entrada un par de vídeos)

Aunque bajo mucha presión lo logre y Sabre ahora esta conectado a ODOO de alguna manera… los Archivos PNR son correctamente leídos desde ODOO y pasan toda su información.

Las limitaciones con ODOO son casi imperceptibles, ahora mismo hay muchas formas de hacer las cosas y si queremos programar algo es cuestión de tiempo y cuanto están dispuesto a invertir por software único o para adaptar a sus necesidades…

El fuerte de este programa en realidad es como leer los archivos PNR, pero a mi me gusto mucho por que aquí si que tuve que colocar toda la carne en el asador, al sacarle el máximo provecho a Python, al usar Diccionarios, Listas, Tuplas, Tuplas de Listas, Diccionarios de Diccionarios, Listas de Diccionarios, Tuplas de listas con Diccionarios, agregar información a estas  estructuras cada ves que se hacían mas complejas era un poco raro al principio pero luego uno se acostumbra…

Hasta aquí esta entrada en la próxima los 2 Vídeos del Sistema corriendo y extrayendo los PNR… Dios les Bendiga y les de Discernimiento…

Pensando en la Proxima entrada y cosas que nos quedan por hacer en Python

Les cuento que esta semana he estado trabajando Full Time programando en Openerp v7, aunque me gustaría subir por lo menos el vídeo de lo que hice debo preguntar si puedo :S… mas o menos los tiros van así, he estado rehaciendo una API de una Aerolinea para extraer los datos de unos archivos llamados PNR, vaya que ni me imaginaba ese mundillo :S, al final todo salio bien gracias a Dios con muchos momentos de frustración al estar en terreno desconocido, pero al final corrió el código y aunque le faltan bastantes detalles(esto es bueno por que tengo trabajo :D) ya esta consumiendo los archivos en cuestión 😀

Debo comunicarles que me he decidido implementar la Base de Datos directamente a ODOO, les hablo del scrapping de la NFL que estaba haciendo, les cuento que tengo mas de 1 semana con una Otitis terrible y ya Gracias a Dios se me esta pasando, Voy a implementarla directamente en ODOO por que asi tendremos un mapeo de la base de datos y vistas interesantes en ODOO ojo que pronto subo un Vídeo 😀

Voy a ir subiendo Vídeos de entradas anteriores para los que no les gusta leer(aunque háganlo un habito :D), voy a comenzar con un Cursito de Python para Dummies en vídeo, así como también un vídeo de buenas practicas debugueando código en python si Dios nos lo permite claro 😀

Hay varias series que hay que retomar si o si, pero ahora trabajo 8 horas al día, y otras 3 copadas, mas 2 en otros proyectos me quedan como 3 libres :S bueno algo haré :D, por ejemplo Criptografia, APIS le tengo el ojo a Google :D, entre otras……. hay bastante que elegir en este blog :S

Bueno hasta aquí esta micro entrada informativa, me despido que Dios les bendiga les ilumine sus pasos y les de discernimiento…

Python Scraping NFL [Parte preliminar 2]

Si si todavía no tengo el código completo, es que he estado pensando mejorar el código cada vez mas y bueno de verdad hasta ahora ya tengo el programa funcionando y saca los datos de las divisiones, los datos de los equipos, y los datos de cada jugador por equipo, lo único que me falta para decir que la primera parte esta terminada es agregarle la base de datos y tendríamos la parte estática funcionando…

La parte dinámica la he ido diseñando de una manera diferente, he pensado en tomar cada juego como una tabla que se llamara fechas o jornadas donde tendremos los equipos enfrentados(ids para la BD) y los resultados, luego tendremos otra tabla con las estadísticas de cada equipo, y luego la tabla mas importante y la final, la que mas nos interesa ya que el objetivo es hacer SABERMETRIA de la NFL con este programita, hablamos de la tabla de las estadísticas de cada jugador por juego, luego estas estadísticas se sumaran y se les agregaran a cada jugador y a cada equipo y por ay me suena algo para las divisiones pero vamos con calma…

Hoy les he venido a mostrar el código hasta ahora y unos cuantos cambios que vamos a ir haciendo, como por ejemplo crear funciones y así tener un código mas simple con las referencias de como hace lo que hace en otro lado, esto para que cuando lleguemos a el Béisbol podamos reutilizar completamente el código simplemente cambiando NFL por Béisbol(esto lo hará el sistema con las URLs)… vamos a ver que tenemos hasta ahora:

Hasta ahora cree 2 archivos Python, diviciones_equipos_y_jugadores_NFL.py y funcion_jugadores_plantel.py, hoy les voy a de como llegue a funcion_jugadores_plantel y es que tuve que pensar unos 10 minutos para tomar algunas decisiones en este código y al final me gusto tanto que comparto como llegue a el 😀

El código es el siguiente:

import requests, urllib2
from bs4 import BeautifulSoup
import re

import math

### Pagina primaria para buscar los datos
url_1er = 'http://www.espn.com.ve/futbol-americano/nfl/equipo/plantel/_/nombre/jax'

            
page_1era = urllib2.urlopen(url_1er)
            
soup_1er = BeautifulSoup(page_1era, 'lxml')

divicion_Diviciones = soup_1er.find_all('table',class_="tablehead" )
results = []
for row in divicion_Diviciones:
        ### los 2 condiciones se van a ejecutar para buscar las headers y luego las rows
        table_headers = row.find_all('th')
        if table_headers:
            results.append([headers.get_text() for headers in table_headers])
           
        table_data = row.find_all('td')
        if table_data:
	    results.append([data.get_text() for data in table_data])
            a_ver = [data for data in table_data]
            
            
            
print results

Y la salida es la siguiente, no se asusten aun vamos a la mitad del código pero quería que vieran esta estructura:

[[u'Ofensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'10', u'Brandon Allen', u'QB', u'24', u'6-2', u'219', u'D', u'Arkansas', u'5', u'Blake Bortles', u'QB', u'24', u'6-5', u'239', u'3', u'UCF', u'7', u'Chad Henne', u'QB', u'31', u'6-3', u'219', u'9', u'Michigan', u'30', u'Corey Grant', u'RB', u'24', u'5-11', u'204', u'2', u'Auburn', u'33', u'Chris Ivory', u'RB', u'28', u'6-0', u'224', u'7', u'Tiffin University', u'16', u'Denard Robinson', u'RB', u'25', u'6-0', u'213', u'4', u'Michigan', u'24', u'T.J. Yeldon', u'RB', u'22', u'6-1', u'223', u'2', u'Alabama', u'17', u'Arrelious Benn', u'RM', u'28', u'6-2', u'222', u'6', u'Illinois', u'14', u'Justin Blackmon', u'RM', u'26', u'6-1', u'210', u'2', u'Oklahoma State', u'13', u'Rashad Greene', u'RM', u'23', u'5-11', u'190', u'2', u'Florida State', u'88', u'Allen Hurns', u'RM', u'24', u'6-3', u'201', u'3', u'Miami', u'11', u'Marqise Lee', u'RM', u'24', u'6-0', u'200', u'3', u'USC', u'15', u'Allen Robinson', u'RM', u'23', u'6-3', u'218', u'3', u'Penn State', u'81', u'Bryan Walters', u'RM', u'28', u'6-0', u'195', u'5', u'Cornell', u'83', u'Ben Koyack', u'TE', u'23', u'6-5', u'269', u'1', u'Notre Dame', u'89', u'Marcedes Lewis', u'TE', u'32', u'6-6', u'280', u'11', u'UCLA', u'87', u'Neal Sterling', u'TE', u'24', u'6-4', u'254', u'2', u'Monmouth', u'80', u'Julius Thomas', u'TE', u'28', u'6-5', u'256', u'6', u'Portland State', u'70', u'Luke Bowanko', u'C', u'25', u'6-6', u'313', u'3', u'Virginia', u'60', u'A.J. Cann', u'J', u'24', u'6-3', u'317', u'2', u'South Carolina', u'65', u'Brandon Linder', u'J', u'24', u'6-6', u'309', u'3', u'Miami', u'77', u'Patrick Omameh', u'J', u'26', u'6-4', u'316', u'4', u'Michigan', u'64', u'Chris Reed', u'J', u'24', u'6-5', u'310', u'1', u'Minnesota State', u'69', u'Tyler Shatley', u'J', u'25', u'6-3', u'306', u'2', u'Clemson', u'68', u'Kelvin Beachum', u'TE', u'27', u'6-3', u'316', u'5', u'SMU', u'76', u'Luke Joeckel', u'TE', u'24', u'6-6', u'312', u'4', u'Texas A&M', u'62', u'Jeffrey Linkenbach', u'TE', u'29', u'6-6', u'317', u'7', u'Cincinnati', u'78', u'Jermey Parnell', u'TE', u'30', u'6-6', u'323', u'6', u'Ole Miss', u'72', u'Josh Wells', u'TE', u'25', u'6-6', u'310', u'3', u'James Madison', u'Defensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'93', u'Tyson Alualu', u'DE', u'29', u'6-3', u'304', u'7', u'California', u'56', u'Dante Fowler Jr.', u'DE', u'22', u'6-3', u'250', u'2', u'Florida', u'91', u'Yannick Ngakoue', u'DE', u'21', u'6-2', u'246', u'D', u'Maryland', u'98', u'Chris Smith', u'DE', u'24', u'6-1', u'262', u'3', u'Arkansas', u'66', u'Jonathan Woodard', u'DE', u'22', u'6-5', u'271', u'D', u'Central Arkansas', u'96', u'Michael Bennett', u'DT', u'23', u'6-2', u'298', u'2', u'Ohio State', u'92', u'Sheldon Day', u'DT', u'22', u'6-1', u'285', u'D', u'Notre Dame', u'90', u'Malik Jackson', u'DT', u'26', u'6-5', u'300', u'5', u'Tennessee', u'95', u'Abry Jones', u'DT', u'25', u'6-4', u'318', u'4', u'Georgia', u'99', u"Sen'Derrick Marks", u'DT', u'29', u'6-2', u'309', u'8', u'Auburn', u'97', u'Roy Miller', u'DT', u'29', u'6-2', u'318', u'8', u'Texas', u'75', u'Jared Odrick', u'DL', u'28', u'6-5', u'298', u'7', u'Penn State', u'59', u'Arthur Brown', u'LB', u'26', u'6-0', u'240', u'4', u'Kansas State', u'44', u'Myles Jack', u'LB', u'21', u'6-1', u'247', u'D', u'UCLA', u'51', u'Paul Posluszny', u'LB', u'31', u'6-2', u'232', u'10', u'Penn State', u'52', u'Hayes Pullard III', u'LB', u'24', u'6-0', u'233', u'2', u'USC', u'55', u'Dan Skuta', u'LB', u'30', u'6-2', u'252', u'8', u'Grand Valley State', u'50', u'Telvin Smith', u'LB', u'25', u'6-3', u'218', u'3', u'Florida State', u'21', u'Prince Amukamara', u'CB', u'27', u'6-0', u'202', u'6', u'Nebraska', u'22', u'Aaron Colvin', u'CB', u'24', u'6-0', u'195', u'3', u'Oklahoma', u'27', u'Dwayne Gratz', u'CB', u'26', u'5-11', u'199', u'4', u'Connecticut', u'31', u'Davon House', u'CB', u'27', u'6-0', u'200', u'6', u'New Mexico State', u'29', u'Josh Johnson', u'CB', u'26', u'5-10', u'195', u'1', u'Purdue', u'20', u'Jalen Ramsey', u'CB', u'21', u'6-2', u'211', u'D', u'Florida State', u'37', u'Johnathan Cyprien', u'S', u'26', u'6-0', u'217', u'4', u'Florida Intl', u'39', u'Tashaun Gipson', u'S', u'26', u'5-11', u'210', u'5', u'Wyoming', u'23', u'James Sample', u'S', u'24', u'6-2', u'215', u'2', u'Louisville', u'25', u'Peyton Thompson', u'S', u'25', u'5-10', u'189', u'2', u'San Jos\xe9 State', u'47', u'Jarrod Wilson', u'S', u'22', u'6-2', u'209', u'D', u'Michigan', u'Equipos especiales', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'2', u'Jason Myers', u'PK', u'25', u'5-10', u'195', u'2', u'Marist', u'3', u'Brad Nortman', u'P', u'27', u'6-2', u'218', u'5', u'Wisconsin', u'46', u'Carson Tinker', u'LS', u'26', u'6-0', u'239', u'4', u'Alabama']]
[u'Ofensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD']


Si nos fijamos bien antes de tirar la toalla y pensar que ya no podemos hacer scraping(recuerda tienes 2 herramientas muy fuertes tu cerebro y python, ademas si cuentas con la ayuda de Dios ni te cuento)… si visualizamos bien aquí están fundidas las 3 tablas de “http://www.espn.com.ve/futbol-americano/nfl/equipo/plantel/_/nombre/jax” y bueno ahora como hacemos para sacar las 3 tablas mejor vamos y buscamos bien cada etiqueta(a mi me dio flojera hacerlo con html y me quede pensando como hacerlo con python)… hasta que di con esta solución sabemos que cada 10 elementos en esa lista ahí información importante como el numero del jugador y los otros datos:


[u'Ofensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'10',

Y bueno como las listas comienzan en 0 en la posición 9 tenemos nuestro primer dato interesantes, pero si colocamos un bucle para sacar los datos de 9 en 9 nos topamos con que el nombre de cada tabla también esta en la lista, por lo que se me ocurrió crear un bucle while debido a que no sabemos cuantos jugadores tiene cada equipo siempre en las tablas y entonces necesitamos que busque los  datos siempre que el nombre de la tabla siguiente no este en la lista, y luego para la siguiente tabla use el mismo contador +1 y ha comenzar de nuevo y así para la ultima tabla, el código final es el siguiente:


import requests, urllib2
from bs4 import BeautifulSoup
import re

import math

### Pagina primaria para buscar los datos
url_1er = 'http://www.espn.com.ve/futbol-americano/nfl/equipo/plantel/_/nombre/jax'

            
page_1era = urllib2.urlopen(url_1er)
            
soup_1er = BeautifulSoup(page_1era, 'lxml')

divicion_Diviciones = soup_1er.find_all('table',class_="tablehead" )
results = []
for row in divicion_Diviciones:
        ### los 2 condiciones se van a ejecutar para buscar las headers y luego las rows
        table_headers = row.find_all('th')
        if table_headers:
            results.append([headers.get_text() for headers in table_headers])
           
        table_data = row.find_all('td')
        if table_data:
	    results.append([data.get_text() for data in table_data])
            a_ver = [data for data in table_data]
            
            
            
print results
results_ofensiva = []

tabl_encbezados_todos = results[0][0:9]
print tabl_encbezados_todos
contador_i = 9
contador_j = 17

for jugador_ofensiva in range(0,50):
    jugador_nfl = results[0][contador_i:contador_j]
    
    if u'Defensiva' in results[0][contador_i:contador_j]:
        break
    else:
        results_ofensiva.append(jugador_nfl)
    
    contador_i += 8
    contador_j += 8
    
    contador_ii = contador_i + 8
    contador_jj = contador_j + 8

print" "
print" "
print" OFENSIVA"
print results_ofensiva



results_defensiva = []
contador_jj =  contador_jj + 1
contador_ii =  contador_ii + 1
for jugador_def in range(0,50):
    jugador_nfl = results[0][contador_ii:contador_jj]
    
    if (u'Equipos especiales') in results[0][contador_ii:contador_jj]:
        break
    else:
        results_defensiva.append(jugador_nfl)
    
    contador_ii += 8
    contador_jj += 8
        
    contador_iii = contador_ii +8
    contador_jjj = contador_jj +8

print" "
print" "
print" Defensiva"
print results_defensiva


results_especiales = []


contador_iii =  contador_iii + 1

contador_jjj =  contador_jjj + 1




for jugador_ofensiva in range(0,50):
    
    if results[0][contador_iii:contador_jjj]:
        jugador_nfl = results[0][contador_iii:contador_jjj]
        results_especiales.append(jugador_nfl)
    
    contador_iii += 8
    contador_jjj += 8


print" "
print" "
print" Equipos especiales"
print results_especiales





Y la salida es la siguiente:

 
[[u'Ofensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'10', u'Brandon Allen', u'QB', u'24', u'6-2', u'219', u'D', u'Arkansas', u'5', u'Blake Bortles', u'QB', u'24', u'6-5', u'239', u'3', u'UCF', u'7', u'Chad Henne', u'QB', u'31', u'6-3', u'219', u'9', u'Michigan', u'30', u'Corey Grant', u'RB', u'24', u'5-11', u'204', u'2', u'Auburn', u'33', u'Chris Ivory', u'RB', u'28', u'6-0', u'224', u'7', u'Tiffin University', u'16', u'Denard Robinson', u'RB', u'25', u'6-0', u'213', u'4', u'Michigan', u'24', u'T.J. Yeldon', u'RB', u'22', u'6-1', u'223', u'2', u'Alabama', u'17', u'Arrelious Benn', u'RM', u'28', u'6-2', u'222', u'6', u'Illinois', u'14', u'Justin Blackmon', u'RM', u'26', u'6-1', u'210', u'2', u'Oklahoma State', u'13', u'Rashad Greene', u'RM', u'23', u'5-11', u'190', u'2', u'Florida State', u'88', u'Allen Hurns', u'RM', u'24', u'6-3', u'201', u'3', u'Miami', u'11', u'Marqise Lee', u'RM', u'24', u'6-0', u'200', u'3', u'USC', u'15', u'Allen Robinson', u'RM', u'23', u'6-3', u'218', u'3', u'Penn State', u'81', u'Bryan Walters', u'RM', u'28', u'6-0', u'195', u'5', u'Cornell', u'83', u'Ben Koyack', u'TE', u'23', u'6-5', u'269', u'1', u'Notre Dame', u'89', u'Marcedes Lewis', u'TE', u'32', u'6-6', u'280', u'11', u'UCLA', u'87', u'Neal Sterling', u'TE', u'24', u'6-4', u'254', u'2', u'Monmouth', u'80', u'Julius Thomas', u'TE', u'28', u'6-5', u'256', u'6', u'Portland State', u'70', u'Luke Bowanko', u'C', u'25', u'6-6', u'313', u'3', u'Virginia', u'60', u'A.J. Cann', u'J', u'24', u'6-3', u'317', u'2', u'South Carolina', u'65', u'Brandon Linder', u'J', u'24', u'6-6', u'309', u'3', u'Miami', u'77', u'Patrick Omameh', u'J', u'26', u'6-4', u'316', u'4', u'Michigan', u'64', u'Chris Reed', u'J', u'24', u'6-5', u'310', u'1', u'Minnesota State', u'69', u'Tyler Shatley', u'J', u'25', u'6-3', u'306', u'2', u'Clemson', u'68', u'Kelvin Beachum', u'TE', u'27', u'6-3', u'316', u'5', u'SMU', u'76', u'Luke Joeckel', u'TE', u'24', u'6-6', u'312', u'4', u'Texas A&M', u'62', u'Jeffrey Linkenbach', u'TE', u'29', u'6-6', u'317', u'7', u'Cincinnati', u'78', u'Jermey Parnell', u'TE', u'30', u'6-6', u'323', u'6', u'Ole Miss', u'72', u'Josh Wells', u'TE', u'25', u'6-6', u'310', u'3', u'James Madison', u'Defensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'93', u'Tyson Alualu', u'DE', u'29', u'6-3', u'304', u'7', u'California', u'56', u'Dante Fowler Jr.', u'DE', u'22', u'6-3', u'250', u'2', u'Florida', u'91', u'Yannick Ngakoue', u'DE', u'21', u'6-2', u'246', u'D', u'Maryland', u'98', u'Chris Smith', u'DE', u'24', u'6-1', u'262', u'3', u'Arkansas', u'66', u'Jonathan Woodard', u'DE', u'22', u'6-5', u'271', u'D', u'Central Arkansas', u'96', u'Michael Bennett', u'DT', u'23', u'6-2', u'298', u'2', u'Ohio State', u'92', u'Sheldon Day', u'DT', u'22', u'6-1', u'285', u'D', u'Notre Dame', u'90', u'Malik Jackson', u'DT', u'26', u'6-5', u'300', u'5', u'Tennessee', u'95', u'Abry Jones', u'DT', u'25', u'6-4', u'318', u'4', u'Georgia', u'99', u"Sen'Derrick Marks", u'DT', u'29', u'6-2', u'309', u'8', u'Auburn', u'97', u'Roy Miller', u'DT', u'29', u'6-2', u'318', u'8', u'Texas', u'75', u'Jared Odrick', u'DL', u'28', u'6-5', u'298', u'7', u'Penn State', u'59', u'Arthur Brown', u'LB', u'26', u'6-0', u'240', u'4', u'Kansas State', u'44', u'Myles Jack', u'LB', u'21', u'6-1', u'247', u'D', u'UCLA', u'51', u'Paul Posluszny', u'LB', u'31', u'6-2', u'232', u'10', u'Penn State', u'52', u'Hayes Pullard III', u'LB', u'24', u'6-0', u'233', u'2', u'USC', u'55', u'Dan Skuta', u'LB', u'30', u'6-2', u'252', u'8', u'Grand Valley State', u'50', u'Telvin Smith', u'LB', u'25', u'6-3', u'218', u'3', u'Florida State', u'21', u'Prince Amukamara', u'CB', u'27', u'6-0', u'202', u'6', u'Nebraska', u'22', u'Aaron Colvin', u'CB', u'24', u'6-0', u'195', u'3', u'Oklahoma', u'27', u'Dwayne Gratz', u'CB', u'26', u'5-11', u'199', u'4', u'Connecticut', u'31', u'Davon House', u'CB', u'27', u'6-0', u'200', u'6', u'New Mexico State', u'29', u'Josh Johnson', u'CB', u'26', u'5-10', u'195', u'1', u'Purdue', u'20', u'Jalen Ramsey', u'CB', u'21', u'6-2', u'211', u'D', u'Florida State', u'37', u'Johnathan Cyprien', u'S', u'26', u'6-0', u'217', u'4', u'Florida Intl', u'39', u'Tashaun Gipson', u'S', u'26', u'5-11', u'210', u'5', u'Wyoming', u'23', u'James Sample', u'S', u'24', u'6-2', u'215', u'2', u'Louisville', u'25', u'Peyton Thompson', u'S', u'25', u'5-10', u'189', u'2', u'San Jos\xe9 State', u'47', u'Jarrod Wilson', u'S', u'22', u'6-2', u'209', u'D', u'Michigan', u'Equipos especiales', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD', u'2', u'Jason Myers', u'PK', u'25', u'5-10', u'195', u'2', u'Marist', u'3', u'Brad Nortman', u'P', u'27', u'6-2', u'218', u'5', u'Wisconsin', u'46', u'Carson Tinker', u'LS', u'26', u'6-0', u'239', u'4', u'Alabama']]
[u'Ofensiva', u'NO', u'NOMBRE', u'POS', u'EDAD', u'MT', u'P', u'EXPERIENCIA', u'UNIVERSIDAD']
 
 
 OFENSIVA
[[u'10', u'Brandon Allen', u'QB', u'24', u'6-2', u'219', u'D', u'Arkansas'], [u'5', u'Blake Bortles', u'QB', u'24', u'6-5', u'239', u'3', u'UCF'], [u'7', u'Chad Henne', u'QB', u'31', u'6-3', u'219', u'9', u'Michigan'], [u'30', u'Corey Grant', u'RB', u'24', u'5-11', u'204', u'2', u'Auburn'], [u'33', u'Chris Ivory', u'RB', u'28', u'6-0', u'224', u'7', u'Tiffin University'], [u'16', u'Denard Robinson', u'RB', u'25', u'6-0', u'213', u'4', u'Michigan'], [u'24', u'T.J. Yeldon', u'RB', u'22', u'6-1', u'223', u'2', u'Alabama'], [u'17', u'Arrelious Benn', u'RM', u'28', u'6-2', u'222', u'6', u'Illinois'], [u'14', u'Justin Blackmon', u'RM', u'26', u'6-1', u'210', u'2', u'Oklahoma State'], [u'13', u'Rashad Greene', u'RM', u'23', u'5-11', u'190', u'2', u'Florida State'], [u'88', u'Allen Hurns', u'RM', u'24', u'6-3', u'201', u'3', u'Miami'], [u'11', u'Marqise Lee', u'RM', u'24', u'6-0', u'200', u'3', u'USC'], [u'15', u'Allen Robinson', u'RM', u'23', u'6-3', u'218', u'3', u'Penn State'], [u'81', u'Bryan Walters', u'RM', u'28', u'6-0', u'195', u'5', u'Cornell'], [u'83', u'Ben Koyack', u'TE', u'23', u'6-5', u'269', u'1', u'Notre Dame'], [u'89', u'Marcedes Lewis', u'TE', u'32', u'6-6', u'280', u'11', u'UCLA'], [u'87', u'Neal Sterling', u'TE', u'24', u'6-4', u'254', u'2', u'Monmouth'], [u'80', u'Julius Thomas', u'TE', u'28', u'6-5', u'256', u'6', u'Portland State'], [u'70', u'Luke Bowanko', u'C', u'25', u'6-6', u'313', u'3', u'Virginia'], [u'60', u'A.J. Cann', u'J', u'24', u'6-3', u'317', u'2', u'South Carolina'], [u'65', u'Brandon Linder', u'J', u'24', u'6-6', u'309', u'3', u'Miami'], [u'77', u'Patrick Omameh', u'J', u'26', u'6-4', u'316', u'4', u'Michigan'], [u'64', u'Chris Reed', u'J', u'24', u'6-5', u'310', u'1', u'Minnesota State'], [u'69', u'Tyler Shatley', u'J', u'25', u'6-3', u'306', u'2', u'Clemson'], [u'68', u'Kelvin Beachum', u'TE', u'27', u'6-3', u'316', u'5', u'SMU'], [u'76', u'Luke Joeckel', u'TE', u'24', u'6-6', u'312', u'4', u'Texas A&M'], [u'62', u'Jeffrey Linkenbach', u'TE', u'29', u'6-6', u'317', u'7', u'Cincinnati'], [u'78', u'Jermey Parnell', u'TE', u'30', u'6-6', u'323', u'6', u'Ole Miss'], [u'72', u'Josh Wells', u'TE', u'25', u'6-6', u'310', u'3', u'James Madison']]
 
 
 Defensiva
[[u'93', u'Tyson Alualu', u'DE', u'29', u'6-3', u'304', u'7', u'California'], [u'56', u'Dante Fowler Jr.', u'DE', u'22', u'6-3', u'250', u'2', u'Florida'], [u'91', u'Yannick Ngakoue', u'DE', u'21', u'6-2', u'246', u'D', u'Maryland'], [u'98', u'Chris Smith', u'DE', u'24', u'6-1', u'262', u'3', u'Arkansas'], [u'66', u'Jonathan Woodard', u'DE', u'22', u'6-5', u'271', u'D', u'Central Arkansas'], [u'96', u'Michael Bennett', u'DT', u'23', u'6-2', u'298', u'2', u'Ohio State'], [u'92', u'Sheldon Day', u'DT', u'22', u'6-1', u'285', u'D', u'Notre Dame'], [u'90', u'Malik Jackson', u'DT', u'26', u'6-5', u'300', u'5', u'Tennessee'], [u'95', u'Abry Jones', u'DT', u'25', u'6-4', u'318', u'4', u'Georgia'], [u'99', u"Sen'Derrick Marks", u'DT', u'29', u'6-2', u'309', u'8', u'Auburn'], [u'97', u'Roy Miller', u'DT', u'29', u'6-2', u'318', u'8', u'Texas'], [u'75', u'Jared Odrick', u'DL', u'28', u'6-5', u'298', u'7', u'Penn State'], [u'59', u'Arthur Brown', u'LB', u'26', u'6-0', u'240', u'4', u'Kansas State'], [u'44', u'Myles Jack', u'LB', u'21', u'6-1', u'247', u'D', u'UCLA'], [u'51', u'Paul Posluszny', u'LB', u'31', u'6-2', u'232', u'10', u'Penn State'], [u'52', u'Hayes Pullard III', u'LB', u'24', u'6-0', u'233', u'2', u'USC'], [u'55', u'Dan Skuta', u'LB', u'30', u'6-2', u'252', u'8', u'Grand Valley State'], [u'50', u'Telvin Smith', u'LB', u'25', u'6-3', u'218', u'3', u'Florida State'], [u'21', u'Prince Amukamara', u'CB', u'27', u'6-0', u'202', u'6', u'Nebraska'], [u'22', u'Aaron Colvin', u'CB', u'24', u'6-0', u'195', u'3', u'Oklahoma'], [u'27', u'Dwayne Gratz', u'CB', u'26', u'5-11', u'199', u'4', u'Connecticut'], [u'31', u'Davon House', u'CB', u'27', u'6-0', u'200', u'6', u'New Mexico State'], [u'29', u'Josh Johnson', u'CB', u'26', u'5-10', u'195', u'1', u'Purdue'], [u'20', u'Jalen Ramsey', u'CB', u'21', u'6-2', u'211', u'D', u'Florida State'], [u'37', u'Johnathan Cyprien', u'S', u'26', u'6-0', u'217', u'4', u'Florida Intl'], [u'39', u'Tashaun Gipson', u'S', u'26', u'5-11', u'210', u'5', u'Wyoming'], [u'23', u'James Sample', u'S', u'24', u'6-2', u'215', u'2', u'Louisville'], [u'25', u'Peyton Thompson', u'S', u'25', u'5-10', u'189', u'2', u'San Jos\xe9 State'], [u'47', u'Jarrod Wilson', u'S', u'22', u'6-2', u'209', u'D', u'Michigan']]
 
 
 Equipos especiales
[[u'2', u'Jason Myers', u'PK', u'25', u'5-10', u'195', u'2', u'Marist'], [u'3', u'Brad Nortman', u'P', u'27', u'6-2', u'218', u'5', u'Wisconsin'], [u'46', u'Carson Tinker', u'LS', u'26', u'6-0', u'239', u'4', u'Alabama']]

Y listo ya con esta información que analice para que no me de ningún error luego podemos comenzar con el siguiente paso que es la Base de Datos, para el Jueves la tendré lista :D, Saludos y que Dios les Bendiga

 

 

 

Pensando en Python, Diferentes Formas de hacer las cosas [parte1]

Bueno por hay he visto muy buenas practicas para programar en python y estaré comentándoles sobre ellas en la semana, pero lo que realmente me ha motivado a crear esta entrada es la serie de Python Scraping NFL y es que de verdad me he visto muy motivado, ya que he visto que aun lo que no tiene nada que ver con este proyecto me ha ayudado y se en Dios que seguirá ayudándome en los proyectos que he emprendido, he comenzado a mejorar el código de la serie Python Scraping NFL y estaba viendo que hay 8 Divisiones en la NFL o Conferencias, y hay 32 equipos, 4 en cada división, y necesito sacar por lo pronto los nombres de las divisiones para agregarlo a la tabla principal Tabla_Divisiones, luego buscar los equipos y agregarlos a la Tabla Equipos_NFL, lo pensé hacer con dos bucles uno para cada tabla y creo que es lo mas lógico… Aquí el Código hasta ahora:

import requests, urllib2
from bs4 import BeautifulSoup
import re

import math

### Pagina primaria para buscar los datos
url_1er = 'http://www.espn.com.ve/futbol-americano/nfl/equipos'

            
page_1era = urllib2.urlopen(url_1er)
            
soup_1er = BeautifulSoup(page_1era, 'lxml')

diviciones  = []


divicion_Diviciones = soup_1er.find_all('div',class_="mod-header stathead" )
for enlace in divicion_Diviciones:
    nombre_divicion = enlace.get_text()
    diviciones.append(nombre_divicion)

print diviciones

print len(diviciones)

print len(diviciones)

### Buscamos las estadisticas de los equipos con esta expresion regular
equipos_1era_tabla  = []

primer_enlace_equipos = soup_1er.find_all('a',class_="bi" )
for enlace in primer_enlace_equipos:
    nombre = enlace.get_text()
    equipos_1era_tabla.append(nombre)

print equipos_1era_tabla

print len(equipos_1era_tabla)

La salida del programa es esta:

[u'NFC Este', u'AFC Este', u'NFC Oeste', u'AFC Oeste', u'NFC Norte', u'AFC Norte', u'NFC Sur', u'AFC Sur']
8

[u'Dallas Cowboys', u'New York Giants', u'Philadelphia Eagles', u'Washington Redskins', u'Buffalo Bills', u'Miami Dolphins', u'New England Patriots', u'New York Jets', u'Arizona Cardinals', u'Los Angeles Rams', u'San Francisco 49ers', u'Seattle Seahawks', u'Denver Broncos', u'Kansas City Chiefs', u'Oakland Raiders', u'San Diego Chargers', u'Chicago Bears', u'Detroit Lions', u'Green Bay Packers', u'Minnesota Vikings', u'Baltimore Ravens', u'Cincinnati Bengals', u'Cleveland Browns', u'Pittsburgh Steelers', u'Atlanta Falcons', u'Carolina Panthers', u'New Orleans Saints', u'Tampa Bay Buccaneers', u'Houston Texans', u'Indianapolis Colts', u'Jacksonville Jaguars', u'Tennessee Titans']
32

El programa hasta aquí nos dice las Divisiones, cuantas son y los equipos y cuantos son, hasta aquí todo bien y ahora necesitaba tomar las 2 listas y fundirlas en una sola para luego saber a que división(con el ID  en la tabla) es a la que pertenece cada equipo, y lo primero que se me ocurrió fue esto:


count_primer = 0

for equipo_divicion in equipos_1era_tabla:
    if count_primer <=3:
        print diviciones[0]
        print equipo_divicion
        
    elif count_primer <=7:
        print diviciones[1]
        print equipo_divicion
        
    elif count_primer <=11:
        print diviciones[2]
        print equipo_divicion  
        
        
    elif count_primer <=15:
        print diviciones[3]
        print equipo_divicion   
        
    elif count_primer <=19:
        print diviciones[4]
        print equipo_divicion
        
    elif count_primer <=23:
        print diviciones[5]
        print equipo_divicion  
        
        
    elif count_primer <=27:
        print diviciones[6]
        print equipo_divicion    
        
    elif count_primer <=31:
        print diviciones[7]
        print equipo_divicion
    count_primer += 1
    

Y la verdad el programa hace lo que estaba pensando que hiciera con unos arreglos podríamos agregarle la Base de Datos y ya tendríamos parte de lo que estamos haciendo, y estaría bien… Pero yo normalmente me pongo a pensar mas allá, y ahora imaginaba tener que introducir código en cada if, y en el peor de los casos no en todo los if, pero se me ocurrió la siguiente idea para no tener que introducir los if…

Tenemos 32 equipos y 8 divisiones sabemos que cada 4 equipos pertenecen a una división, entonces me invente crear 2 contadores mas y dividirlos en 4 partes desde 0 a 0,75, el segundo contador es para redondear hacia abajo el valor del primero  y usarlo como entero ya que las listas no soportan flotantes o decimales, y así rebaje un código que ya se estaba haciendo muy largo a uno de unas pocas lineas que funciona:

Aquí el Código:


count_primer = 0
count_divicion = 0
count_redondeado = 0
for equipo_divicion in equipos_1era_tabla:

   print diviciones[count_redondeado]
   print equipos_1era_tabla[count_primer] 
   count_primer += 1
   count_divicion +=0.25
   count_redondeado = math.floor(count_divicion)
   count_redondeado = int(count_redondeado)

 Y esto era lo que quería compartir, el como un algoritmo bien pensado nos puede ayudar mucho a reducir el código y a mejorar el rendimiento…..

Saludos y que Dios te Bendiga….. Comentar es gratis

Python Scraping NFL [Parte preliminar]

Les cuento que he estado codificando el programa que espero sea de mucho provecho para el que pase por aquí como lo es para mi el aprendizaje que me va quedando cada vez que intento hacer algo en python…. de verdad que estos Días han sido de mucho aprendizaje y re-aprendizaje, la verdad es que se me pasan tantas cosas por la mente cuando estoy escribiendo código que tengo que anotar muchas cosas y cada vez tengo mejores ideas para proyectos que he dejado a medio empezar…. Lo único malo es que cuando no tenemos un diseño Real o metódico de que vamos a hacer y cual es el alcance normalmente no llegamos a cumplir con nuestras expectativas, por eso siempre trato de mirar las cosas desde varios ángulos.

Es precisamente esto lo que me ha pasado con el programa que he estado haciendo en mis ratos libres para la NFL(Ojala trabajara para ellos jajaja), mas bien el programa estadístico sobre la NFL,  les cuento había planificado hacerlo así:

  1. entrar a la pagina resultados y buscar todos los equipos
  2. entrar a cada equipo, agregar los datos del Equipo a la Tabla Equipo
  3. entrar a estadísticas del Equipo agregar los Datos a la tabla estadísticas_equipo
  4. entrar a cada jugador y agregar los datos importantes a la Tabla Jugadores_NFL

Ya aquí ahí un problema por que no es natural que el flujo de los datos sea de esta manera, el paso 4 debería ir antes que el 3 si queremos hacer una BD Relacional, por lo que aunque voy a colocar el código interesante que cree hasta ahora para buscar a los jugadores es decir hasta el Paso 4 sin tocar el 3(ojo no he agregado los datos a la BD) este es el código:

import requests, urllib2
from bs4 import BeautifulSoup
import re

### Pagina primaria para buscar los datos
url = 'http://www.espn.com.ve/futbol-americano/nfl/resultados'


html = urllib2.urlopen(url).read()



equipos_para_estadisticas  = []

### Buscamos las estadisticas de los equipos con esta expresion regular
enlaces_2 = re.findall('http://www.espn.com.ve/futbol-americano/nfl/equipo/estadisticas/_/nombre/(\S+?)"', html)
for enlace in enlaces_2:
    equipos_para_estadisticas.append(enlace)

    





jugadores = []

### Entramos a las estadisticas y buscamos a los jugadores
for equipos in equipos_para_estadisticas:
      url2 = 'http://www.espn.com.ve/futbol-americano/nfl/equipo/estadisticas/_/nombre/' + equipos
      
      page2 = urllib2.urlopen(url2).read()
            
      enlaces = re.findall('href="(http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/.*?)"', page2)
      
      jugadores_americano = []
      datos_jugador = []
      
      ### Entramos a la URL de cada jugador y extraemos los datos 

      for enlace2 in enlaces:
            print enlace2
            url_new_3 = enlace2
            
            page3 = urllib2.urlopen(url_new_3)
            
            soup3 = BeautifulSoup(page3, 'lxml')
            
            tables3 = soup3.find_all('div',class_="player-bio" )

            datos_jugador_siempre = []

            for row in tables3:
	        
                print row.text.strip().replace('\n',' ').replace("\t", " ").replace("\r", " ")
                
                d_jugador = row.text.strip().replace('\n',' ').replace("\t", " ").replace("\r", " ")
                    
                datos_jugador_siempre.append(d_jugador)
                for lista in datos_jugador_siempre:
                        numero_camiseta = lista[0:3] 
                        
                        print "Num de camiseta:", numero_camiseta
                        
                        posicion_jugador = lista[4:6] 
                        
                        print "Posicion:", posicion_jugador                        
                        
                        altura_jugador = re.findall('#[0-9].+? [A-Z].([0-9]\' [0-9])',lista )
                        if altura_jugador == []:
			    print "Altura No especificado"
                        else:
                            print "Altura:", altura_jugador[0] 

                        
                        
                        peso_jugador = re.findall('([0-9]+? lbs)',lista )
                        if peso_jugador == []:
			    print "Peso No especificado"
                        else:
                            print "Peso:", peso_jugador[0] 
                        
                

                        
                        fecha_nac = re.findall('Nacimiento([0-9]+? [a-z]..+? [0-9]...)',lista )
                        if fecha_nac == []:
			    print "Fecha Nacimiento No especificado"
                        else:
                            print "Fecha Nacimiento:", fecha_nac[0] 
                        

                        
                        
                           
                        lugar_nac = re.findall('[0-9]... en ([A-z]+, ..)',lista ) 
                        if lugar_nac == []:
			    print "Lugar Nacimiento No especificado"
                        else:
                            print "Lugar Nacimiento:", lugar_nac[0] 
                        
                                                  
                        experiencia_jugador = re.findall('Experiencia(......+?)Universidad',lista )
                        if experiencia_jugador == []:
			    print "Experiencia No especificada"
                        else:
                            print "Experiencia:", experiencia_jugador[0] 
                        
                        
                        universidad_jugador = re.findall('Universidad([A-Za-z]+)',lista )
                        if universidad_jugador == []:
			    print "Universidad No especificado"
                        else:
                            print "Universidad:", universidad_jugador[0] 
                        
                        

La salida es la siguiente:

 
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/2511109/trevor-siemian
#13 QB6' 3", 220 lbsDenver BroncosFecha de Nacimiento26 dic, 1991 en Danbury, CT (Edad: 24)Reclutado  2015: 7ma Rnd, 250th por DENExperiencia2do TemporadaUniversidadNorthwestern
Num de camiseta: #13
Posicion: QB
Altura: 6' 3
Peso: 220 lbs
Fecha Nacimiento: 26 dic, 1991
Lugar Nacimiento: Danbury, CT
Experiencia: 2do Temporada
Universidad: Northwestern
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/2511109/trevor-siemian
#13 QB6' 3", 220 lbsDenver BroncosFecha de Nacimiento26 dic, 1991 en Danbury, CT (Edad: 24)Reclutado  2015: 7ma Rnd, 250th por DENExperiencia2do TemporadaUniversidadNorthwestern
Num de camiseta: #13
Posicion: QB
Altura: 6' 3
Peso: 220 lbs
Fecha Nacimiento: 26 dic, 1991
Lugar Nacimiento: Danbury, CT
Experiencia: 2do Temporada
Universidad: Northwestern
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/16040/c.j.-anderson
#22 RB5' 8", 224 lbsDenver BroncosFecha de Nacimiento10 feb, 1991 en Richmond, CA (Edad: 25)Experiencia4to TemporadaUniversidadCalifornia
Num de camiseta: #22
Posicion: RB
Altura: 5' 8
Peso: 224 lbs
Fecha Nacimiento: 10 feb, 1991
Lugar Nacimiento: Richmond, CA
Experiencia: 4to Temporada
Universidad: California
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/16040/c.j.-anderson
#22 RB5' 8", 224 lbsDenver BroncosFecha de Nacimiento10 feb, 1991 en Richmond, CA (Edad: 25)Experiencia4to TemporadaUniversidadCalifornia
Num de camiseta: #22
Posicion: RB
Altura: 5' 8
Peso: 224 lbs
Fecha Nacimiento: 10 feb, 1991
Lugar Nacimiento: Richmond, CA
Experiencia: 4to Temporada
Universidad: California
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/13295/emmanuel-sanders
#10 RM5' 11", 180 lbsDenver BroncosFecha de Nacimiento17 mar, 1987 en Bellville, TX (Edad: 29)Reclutado  2010: 3er Rnd, 82nd por PITExperiencia7ma TemporadaUniversidadSMU
Num de camiseta: #10
Posicion: RM
Altura: 5' 1
Peso: 180 lbs
Fecha Nacimiento: 17 mar, 1987
Lugar Nacimiento: Bellville, TX
Experiencia: 7ma Temporada
Universidad: SMU
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/13295/emmanuel-sanders
#10 RM5' 11", 180 lbsDenver BroncosFecha de Nacimiento17 mar, 1987 en Bellville, TX (Edad: 29)Reclutado  2010: 3er Rnd, 82nd por PITExperiencia7ma TemporadaUniversidadSMU
Num de camiseta: #10
Posicion: RM
Altura: 5' 1
Peso: 180 lbs
Fecha Nacimiento: 17 mar, 1987
Lugar Nacimiento: Bellville, TX
Experiencia: 7ma Temporada
Universidad: SMU
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/17497/todd-davis
#51 LB6' 1", 230 lbsDenver BroncosFecha de Nacimiento17 may, 1992 en Inglewood, CA (Edad: 24)Experiencia3er TemporadaUniversidadSacramento State
Num de camiseta: #51
Posicion: LB
Altura: 6' 1
Peso: 230 lbs
Fecha Nacimiento: 17 may, 1992
Lugar Nacimiento: Inglewood, CA
Experiencia: 3er Temporada
Universidad: Sacramento
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/17497/todd-davis
#51 LB6' 1", 230 lbsDenver BroncosFecha de Nacimiento17 may, 1992 en Inglewood, CA (Edad: 24)Experiencia3er TemporadaUniversidadSacramento State
Num de camiseta: #51
Posicion: LB
Altura: 6' 1
Peso: 230 lbs
Fecha Nacimiento: 17 may, 1992
Lugar Nacimiento: Inglewood, CA
Experiencia: 3er Temporada
Universidad: Sacramento
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/14398/chris-harris-jr.
#25 CB5' 10", 199 lbsDenver BroncosFecha de Nacimiento18 jun, 1989 en Bixby, OK (Edad: 27)Experiencia5to TemporadaUniversidadKansas
Num de camiseta: #25
Posicion: CB
Altura: 5' 1
Peso: 199 lbs
Fecha Nacimiento: 18 jun, 1989
Lugar Nacimiento: Bixby, OK
Experiencia: 5to Temporada
Universidad: Kansas
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/14398/chris-harris-jr.
#25 CB5' 10", 199 lbsDenver BroncosFecha de Nacimiento18 jun, 1989 en Bixby, OK (Edad: 27)Experiencia5to TemporadaUniversidadKansas
Num de camiseta: #25
Posicion: CB
Altura: 5' 1
Peso: 199 lbs
Fecha Nacimiento: 18 jun, 1989
Lugar Nacimiento: Bixby, OK
Experiencia: 5to Temporada
Universidad: Kansas
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/2511109/trevor-siemian
#13 QB6' 3", 220 lbsDenver BroncosFecha de Nacimiento26 dic, 1991 en Danbury, CT (Edad: 24)Reclutado  2015: 7ma Rnd, 250th por DENExperiencia2do TemporadaUniversidadNorthwestern
Num de camiseta: #13
Posicion: QB
Altura: 6' 3
Peso: 220 lbs
Fecha Nacimiento: 26 dic, 1991
Lugar Nacimiento: Danbury, CT
Experiencia: 2do Temporada
Universidad: Northwestern
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/16040/c.j.-anderson
#22 RB5' 8", 224 lbsDenver BroncosFecha de Nacimiento10 feb, 1991 en Richmond, CA (Edad: 25)Experiencia4to TemporadaUniversidadCalifornia
Num de camiseta: #22
Posicion: RB
Altura: 5' 8
Peso: 224 lbs
Fecha Nacimiento: 10 feb, 1991
Lugar Nacimiento: Richmond, CA
Experiencia: 4to Temporada
Universidad: California
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/2974317/andy-janovich
#32 FB6' 1", 238 lbsDenver BroncosFecha de Nacimiento23 may, 1993 (Edad: 23)Reclutado  2016: 6to Rnd, 176th por DENExperiencia NOVATOUniversidadNebraska
Num de camiseta: #32
Posicion: FB
Altura: 6' 1
Peso: 238 lbs
Fecha Nacimiento: 23 may, 1993
Lugar Nacimiento No especificado
Experiencia:  NOVATO
Universidad: Nebraska
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/2511109/trevor-siemian
#13 QB6' 3", 220 lbsDenver BroncosFecha de Nacimiento26 dic, 1991 en Danbury, CT (Edad: 24)Reclutado  2015: 7ma Rnd, 250th por DENExperiencia2do TemporadaUniversidadNorthwestern
Num de camiseta: #13
Posicion: QB
Altura: 6' 3
Peso: 220 lbs
Fecha Nacimiento: 26 dic, 1991
Lugar Nacimiento: Danbury, CT
Experiencia: 2do Temporada
Universidad: Northwestern
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/3122866/devontae-booker
#23 RB5' 11", 219 lbsDenver BroncosFecha de Nacimiento27 may, 1992 en Sacramento, CA (Edad: 24)Reclutado  2016: 4to Rnd, 136th por DENExperiencia NOVATOUniversidadUtah
Num de camiseta: #23
Posicion: RB
Altura: 5' 1
Peso: 219 lbs
Fecha Nacimiento: 27 may, 1992
Lugar Nacimiento: Sacramento, CA
Experiencia:  NOVATO
Universidad: Utah
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/13295/emmanuel-sanders
#10 RM5' 11", 180 lbsDenver BroncosFecha de Nacimiento17 mar, 1987 en Bellville, TX (Edad: 29)Reclutado  2010: 3er Rnd, 82nd por PITExperiencia7ma TemporadaUniversidadSMU
Num de camiseta: #10
Posicion: RM
Altura: 5' 1
Peso: 180 lbs
Fecha Nacimiento: 17 mar, 1987
Lugar Nacimiento: Bellville, TX
Experiencia: 7ma Temporada
Universidad: SMU
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/13216/demaryius-thomas
#88 RM6' 3", 229 lbsDenver BroncosFecha de Nacimiento25 dic, 1987 en Montrose, GA (Edad: 28)Reclutado  2010: 1er Rnd, 22avo por DENExperiencia7ma TemporadaUniversidadGeorgia Tech
Num de camiseta: #88
Posicion: RM
Altura: 6' 3
Peso: 229 lbs
Fecha Nacimiento: 25 dic, 1987
Lugar Nacimiento: Montrose, GA
Experiencia: 7ma Temporada
Universidad: Georgia
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/16040/c.j.-anderson
#22 RB5' 8", 224 lbsDenver BroncosFecha de Nacimiento10 feb, 1991 en Richmond, CA (Edad: 25)Experiencia4to TemporadaUniversidadCalifornia
Num de camiseta: #22
Posicion: RB
Altura: 5' 8
Peso: 224 lbs
Fecha Nacimiento: 10 feb, 1991
Lugar Nacimiento: Richmond, CA
Experiencia: 4to Temporada
Universidad: California
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/14085/virgil-green
#85 TE6' 5", 255 lbsDenver BroncosFecha de Nacimiento3 ago, 1988 en San Bernardino, CA (Edad: 28)Reclutado  2011: 7ma Rnd, 204th por DENExperiencia6to TemporadaUniversidadNevada
Num de camiseta: #85
Posicion: TE
Altura: 6' 5
Peso: 255 lbs
Fecha Nacimiento: 3 ago, 1988
Lugar Nacimiento No especificado
Experiencia: 6to Temporada
Universidad: Nevada
http://www.espn.com.ve/futbol-americano/nfl/jugador/_/id/16969/kapri-bibbs
^CTraceback (most recent call last):

De verdad que el programa hace lo que tiene que hacer pero no es totalmente funcional desde mi punto de vista para diseñar este programa fui entendiendo que el flujo de los datos debe ser lo mas real posible ademas que el programa debe constar de 2 fases o dos programas y una sola BD, por que hay una fase estática o de recolección de datos estáticos y luego tengo la fase Dinámica donde debemos ver quien jugo con quien como le fue, las estadísticas para cada jugador de ese juego, y otras muchas cosas interesantes…

Por ahora nos vamos a centrar en el diseño y en cuales son los datos que vamos a extraer 1 sola vez cada cierto tiempo, por ejemplo el diseño puede ser:

  1. Extraer el nombre del equipo y la división de la pagina Equipos, extraer los URLs de cada Equipo
  2. ingresar a la Plantilla de cada equipo, extraer los URLs de cada jugador, extraer algunos datos de aquí
  3. ingresar a cada jugador y extraer los datos interesantes, unificar los datos con los datos extraídos anteriormente.
  4. ingresar a Estadisticas por Equipo y  extraer los datos de cada jugador, aqui tendría que crear varias bases de datos o unificar por 1 numero para ver los defensa y las ofensivas de cada equipo
  5. Los siguientes pasos serian las parte dinámica, por ejemplo los score contra cada equipo, juego a juego, las estadísticas de cada juego para el equipo y para cada jugador

Hasta aquí vamos a llegar con esta interesante aventura, que Dios les Bendiga

 

 

Scraping con Python, Buscar todas las href

En estos días que he estado  trabajando con Scraping de ESPN específicamente NFL, me he dado cuenta que una de las cosas que voy a hacer siempre es revisar las URLs que hay en la pagina para conectarme a otras paginas de interés, claro queda a cada diseño de aplicación cuales datos guardar y cuales no….

No quise seguir con el Scraping a el fútbol soccer ya que me di cuenta que no contaban con tantas estadísticas por jugador, y a mi lo que me interesa es esto para implementar la Sabermetria de Jugadores y cuanto ayudan al equipo esta o aquella rotación o esta o aquella batería(en Béisbol) en NFL se manejan muchas otras cosas aunque se tratan con mayor sencillez y creo que esto puede cambiar….

Como ejemplo podemos tomar la NFL, donde tenemos los partidos jugados y de aquí podemos hacer clics en el equipo y entrar a plantillas o estadísticas o a la ficha del juego, pero para poder hacer un robot que consuma todos estos datos necesitamos decirle busca las URLs y ya luego decirle cuales visitar y que datos buscar, así de sencillo es…

Vamos a tomar como ejemplo en lo que estoy trabajando Equipos de la NFL vamos a verificar cuales son todas las paginas a las que hace referencia esta pagina simplemente mirando los href que son los hipervinculos a otras paginas :D, ojo en el camino nos vamos a encontrar con partes de la paginas con sus prefijos en las mismas pero esto es otra historia….

Para buscar las URLs tenemos 2 opciones usar Expresiones Regulares y usar BeautifulSoup que es mas o menos lo mismo pero creo que la que consume menos recursos es Expresiones regulares aquí vamos a ver los 2 ejemplos, aquí el primero con Expresiones Regulares:

import urllib2, re

    
url = ("http://www.espn.com.ve/futbol-americano/nfl/equipos")
html = urllib2.urlopen(url).read()
enlaces = re.findall('href="(http://.*?)"', html)
for enlace in enlaces:
    print enlace

la salida de este programa es la siguiente:

http://espndeportes.espn.com/futbol-americano/nfl/equipos
http://www.espn.com.mx/futbol-americano/nfl/equipos
http://www.espn.com.co/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://www.espn.cl/futbol-americano/nfl/equipos
http://www.espn.com.ar/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://buscar.espn.go.com/s/opensearch_es
http://a.espncdn.com/combiner/c?v=201105061640&css=global_reset.r1.css,base.r236.css,modules.r453.css,global_header.r41.css,modules/global_nav.r47.css,mem2010/mem.r5.css,mem2010/mem_espn360.r2.css,warvertical12e.css,universal_overlay/universal_overlay.css,universal_overlay/media_overlay.css,universal_overlay/video_overlay.css,universal_overlay/photo_overlay.css,universal_overlay/dyk_overlay.css,modules_deportes.201004281136.css,/espn/espn/styles/frontpage_scoreboard_10,base.deportes.r21.css,soccer.base.r31.css
http://a.espncdn.com/combiner/c?css=sprites/teamlogos.r15.css
http://a.espncdn.com/prod/styles/modules/master_tables_09.r3.css
http://a.espncdn.com/players/web-player-bundle/latest/espn-web-player-bundle.css
http://a.espncdn.com/legacy/transitionalHeader/1.0.10/css/transitional-header.css
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/dal/dallas-cowboys
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyg/new-york-giants
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/phi/philadelphia-eagles
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/wsh/washington-redskins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/buf/buffalo-bills
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/mia/miami-dolphins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ne/new-england-patriots
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyj/new-york-jets
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ari/arizona-cardinals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/la/los-angeles-rams
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sf/san-francisco-49ers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sea/seattle-seahawks
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/den/denver-broncos
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/kc/kansas-city-chiefs
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/oak/oakland-raiders
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sd/san-diego-chargers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/chi/chicago-bears
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/det/detroit-lions
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/gb/green-bay-packers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/min/minnesota-vikings
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/bal/baltimore-ravens
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cin/cincinnati-bengals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cle/cleveland-browns
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/pit/pittsburgh-steelers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/atl/atlanta-falcons
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/car/carolina-panthers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/no/new-orleans-saints
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/tb/tampa-bay-buccaneers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/hou/houston-texans
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ind/indianapolis-colts
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/jax/jacksonville-jaguars
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ten/tennessee-titans
http://www.espnrun.com/
http://espnplay.com
http://www.espn.com.ve
http://guia.espn.com/
http://www.espn.com.ve/videohub/video/indexDeportes
http://www.espn.com.ve/futbol-americano/nfl/estadisticas
http://www.espn.com.ve/futbol-americano/nfl/equipos
http://www.espn.com.ve/futbol-americano/nfl/jugadores
Home
http://preferences.truste.com/2.0/?type=espn&affiliateId=148 http://www.espn.com/espn/news/story?page=patents http://www.espn.bumeran.com.ar http://www.joinourteam.espn.com/joinourteam/
Spanish – Latin American / Español – Latinoamérica – Disney Terms of Use
Spanish

Ahora si solo queremos los equipos deberíamos hacer algo como esto:

import urllib2, re

    
url = ("http://www.espn.com.ve/futbol-americano/nfl/equipos")
html = urllib2.urlopen(url).read()
enlaces = re.findall('href="(http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre.*?)"', html)
for enlace in enlaces:
    print enlace

Y la salida seria algo como lo siguiente:


http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/dal/dallas-cowboys
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyg/new-york-giants
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/phi/philadelphia-eagles
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/wsh/washington-redskins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/buf/buffalo-bills
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/mia/miami-dolphins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ne/new-england-patriots
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyj/new-york-jets
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ari/arizona-cardinals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/la/los-angeles-rams
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sf/san-francisco-49ers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sea/seattle-seahawks
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/den/denver-broncos
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/kc/kansas-city-chiefs
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/oak/oakland-raiders
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/sd/san-diego-chargers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/chi/chicago-bears
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/det/detroit-lions
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/gb/green-bay-packers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/min/minnesota-vikings
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/bal/baltimore-ravens
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cin/cincinnati-bengals
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/cle/cleveland-browns
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/pit/pittsburgh-steelers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/atl/atlanta-falcons
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/car/carolina-panthers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/no/new-orleans-saints
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/tb/tampa-bay-buccaneers
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/hou/houston-texans
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ind/indianapolis-colts
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/jax/jacksonville-jaguars
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/ten/tennessee-titans

Ahora si queremos sacar el short-name de cada equipo  seria algo como lo siguiente:

import urllib2,re
url = ("http://www.espn.com.ve/futbol-americano/nfl/equipos")
html = urllib2.urlopen(url).read()
enlaces = re.findall('href="http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/([a-z]+?)/', html)

nombres_short = []
for enlace in enlaces:
    nombres_short.append(enlace)    

print nombres_short

y la salida algo como esto:

['dal', 'nyg', 'phi', 'wsh', 'buf', 'mia', 'ne', 'nyj', 'ari', 'la', 'sf', 'sea', 'den', 'kc', 'oak', 'sd', 'chi', 'det', 'gb', 'min', 'bal', 'cin', 'cle', 'pit', 'atl', 'car', 'no', 'tb', 'hou', 'ind', 'jax', 'ten']

La verdad no esta mal hacerlo con Expresiones regulares si buscamos cosas muy especificas en el HTML digo, por que casi siempre vamos a tener que hacer uso de ellas, muchos piensan que por que usan librerías externas no están usando RE y les cuento que muchas librerías de búsqueda están programadas en RE básicamente, Para hacer búsquedas a fondo necesitamos librerías especiales para HTML y para esto usaremos BeautifulSoup nada mas miremos como queda nuestro código que busca URLs con esta librería:

from BeautifulSoup import BeautifulSoup
import urllib2
import re

html_page = urllib2.urlopen("http://www.espn.com.ve/futbol-americano/nfl/equipos")
soup = BeautifulSoup(html_page)
for link in soup.findAll('a'):
    print link.get('href')
    
    
print 


La salida contiene en parte esto(no la voy a colocar completa):


http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/estadisticas/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/calendario/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/plantel/_/nombre/dal/dallas-cowboys
/futbol-americano/nfl/equipo/profundidad/_/nombre/dal/dallas-cowboys
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/estadisticas/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/calendario/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/plantel/_/nombre/nyg/new-york-giants
/futbol-americano/nfl/equipo/profundidad/_/nombre/nyg/new-york-giants
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/estadisticas/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/calendario/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/plantel/_/nombre/phi/philadelphia-eagles
/futbol-americano/nfl/equipo/profundidad/_/nombre/phi/philadelphia-eagles
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/estadisticas/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/calendario/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/plantel/_/nombre/wsh/washington-redskins
/futbol-americano/nfl/equipo/profundidad/_/nombre/wsh/washington-redskins
http://www.espn.com.ve/futbol-americano/nfl/equipo/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/estadisticas/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/calendario/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/plantel/_/nombre/buf/buffalo-bills
/futbol-americano/nfl/equipo/profundidad/_/nombre/buf/buffalo-bills

Podemos visualizar URLs que antes no veíamos, y ahora si podemos usar nuestras RE para buscar cosas especificas :D, hasta aquí lo vamos a dejar no quiero ser repetitivo, Dios les Bendiga… Hasta la próxima