Conversión a Python versión 3.6
En esta clase convertiremos nuestro programa de la versión 2.7 a la versión 3.6
# Proyecto Web Scraping para SEO con Python
# Clase 11: Conversión a Python versión 3.6
# webscrap11
import urllib.request, urllib.parse, urllib.error
import re
import sys
url_sitio = «https://evginformatica.blogspot.com/»
url_inicio=url_sitio
lista_enlaces = []
titulos = []
descripciones = []
def buscar_enlaces(posicion,busqueda):
url = lista_enlaces[posicion]
htmlbytes = urllib.request.urlopen(url).read()
html2 = htmlbytes.decode(«utf-8»)
html = urllib.parse.unquote(html2)
#buscar <title>
if titulos[posicion]==«»:
titulo = re.findall( «<title>.+</title>», html)
if titulo!=[]:
titulo_esp=titulo[0]
titulos[posicion]=titulo_esp[7:-8]
#buscar descripcion
#<meta content=’…’ name=’description’/>
if descripciones[posicion]==«»:
desc = re.findall(«<meta content=.+name=’description’/>», html)
if desc!=[]:
desc_esp=desc[0]
descripciones[posicion]=desc_esp[15:-22]
#buscar enlaces href
enlaces = re.findall(busqueda, html)
for enlace in enlaces:
#quitar href=’ y quitar comilla final
enlace2 = enlace[6:-1]
#enlaces excluidos
#/search
# o que contienen #
# solo paginas .html
anadir=True
if enlace2.find(«.html»)<0:
anadir=False
if enlace2.find(«/search»)>0:
anadir=False
if enlace2.find(«#»)>0:
anadir=False
if enlace2 in lista_enlaces:
anadir=False
if anadir:
lista_enlaces.append(enlace2)
titulos.append(«»)
descripciones.append(«»)
def web_scrapin():
print(«— Web Scraping —«)
#esto es para indicar que la codificación del fichero es utf-8
#no ascii #reload(sys)
#sys.setdefaultencoding(‘utf-8’)
# no es necesario en la version 3.6
#redirigir salida estandard a fichero
fichero=open(‘c:\webscrap.txt’, ‘w’)
sys.stdout=fichero
print(«— Información del sitio «+url_sitio)
print(«— Enlaces internos —«)
lista_enlaces.append(url_inicio)
titulos.append(«»)
descripciones.append(«»)
posicion = 0
while True:
#print «— «+lista_enlaces[posicion]
busqueda = «href='»+url_sitio+«.+?'»
buscar_enlaces(posicion,busqueda)
busqueda = ‘href=»‘+url_sitio+‘.+?»‘
buscar_enlaces(posicion,busqueda)
posicion = posicion+1
#pruebas
#if posicion >= 2:
# break
if posicion >= len(lista_enlaces):
break
i=1
for lenlace in lista_enlaces:
print(str(i)+» «+lenlace)
print(» Titulo: «+titulos[i-1])
print(» Descripcion: «+descripciones[i-1])
i=i+1
#volver a poner la salida estandard como estaba
sys.stdout=sys.__stdout__
print(«— Fin Web Scraping —«)
if __name__ == «__main__»:
web_scrapin()
# Clase 11: Conversión a Python versión 3.6
# webscrap11
import urllib.request, urllib.parse, urllib.error
import re
import sys
url_sitio = «https://evginformatica.blogspot.com/»
url_inicio=url_sitio
lista_enlaces = []
titulos = []
descripciones = []
def buscar_enlaces(posicion,busqueda):
url = lista_enlaces[posicion]
htmlbytes = urllib.request.urlopen(url).read()
html2 = htmlbytes.decode(«utf-8»)
html = urllib.parse.unquote(html2)
#buscar <title>
if titulos[posicion]==«»:
titulo = re.findall( «<title>.+</title>», html)
if titulo!=[]:
titulo_esp=titulo[0]
titulos[posicion]=titulo_esp[7:-8]
#buscar descripcion
#<meta content=’…’ name=’description’/>
if descripciones[posicion]==«»:
desc = re.findall(«<meta content=.+name=’description’/>», html)
if desc!=[]:
desc_esp=desc[0]
descripciones[posicion]=desc_esp[15:-22]
#buscar enlaces href
enlaces = re.findall(busqueda, html)
for enlace in enlaces:
#quitar href=’ y quitar comilla final
enlace2 = enlace[6:-1]
#enlaces excluidos
#/search
# o que contienen #
# solo paginas .html
anadir=True
if enlace2.find(«.html»)<0:
anadir=False
if enlace2.find(«/search»)>0:
anadir=False
if enlace2.find(«#»)>0:
anadir=False
if enlace2 in lista_enlaces:
anadir=False
if anadir:
lista_enlaces.append(enlace2)
titulos.append(«»)
descripciones.append(«»)
def web_scrapin():
print(«— Web Scraping —«)
#esto es para indicar que la codificación del fichero es utf-8
#no ascii #reload(sys)
#sys.setdefaultencoding(‘utf-8’)
# no es necesario en la version 3.6
#redirigir salida estandard a fichero
fichero=open(‘c:\webscrap.txt’, ‘w’)
sys.stdout=fichero
print(«— Información del sitio «+url_sitio)
print(«— Enlaces internos —«)
lista_enlaces.append(url_inicio)
titulos.append(«»)
descripciones.append(«»)
posicion = 0
while True:
#print «— «+lista_enlaces[posicion]
busqueda = «href='»+url_sitio+«.+?'»
buscar_enlaces(posicion,busqueda)
busqueda = ‘href=»‘+url_sitio+‘.+?»‘
buscar_enlaces(posicion,busqueda)
posicion = posicion+1
#pruebas
#if posicion >= 2:
# break
if posicion >= len(lista_enlaces):
break
i=1
for lenlace in lista_enlaces:
print(str(i)+» «+lenlace)
print(» Titulo: «+titulos[i-1])
print(» Descripcion: «+descripciones[i-1])
i=i+1
#volver a poner la salida estandard como estaba
sys.stdout=sys.__stdout__
print(«— Fin Web Scraping —«)
if __name__ == «__main__»:
web_scrapin()
Las diferencias entre la versión 2.7 y la 3.6 para este programa son
htmlbytes = urllib.request.urlopen(url).read()
html2 = htmlbytes.decode(«utf-8»)
html = urllib.parse.unquote(html2)
Cambia la función urlopen y devuelve una secuencia de bytes en vez de un string.
Se aplica la función decode para obtener un string en formato UTF-8
Con urllib.parse.unquote se quitan las marcas especiales (%20…)
Los ficheros por defecto son en formato UTF-8
En python 3.6 print es una función no una sentencia por lo que tiene que ir con paréntesis.