#!/usr/bin/env python
# coding: utf-8

# In[ ]:


# -*- coding: utf-8 -*-
"""
Created on Tue Jan 12 17:43:43 2021


# In[ ]:


@author: borja
"""


# 

# In[1]:


from urllib.request import urlopen


# Lo primero que vamos a hacer es abrir una pagina<br>
# http://olympus.realpython.org/profiles/aphrodite

# In[2]:


url = "http://olympus.realpython.org/profiles/aphrodite"


# In[3]:


page = urlopen(url)


# In[4]:


page


# A continuacion sacamos la estructura del HTML

# In[5]:


html_bytes = page.read()
html = html_bytes.decode("utf-8")


# In[6]:


print(html)


# Procedemos a extraer diferentes partes a través de extracción de texto.<br>
# La extracción del texto será marcando el inicio y el fin.  Debemos tener en cuenta que tras cada línea existe un salto de línea (\n) que también cuenta en la posición inicial del texto a extraer.
# Buscamos el titulo.

# In[7]:


title_index = html.find("<title>")
title_index


# Seleccionamos donde comienza el contenido del titulo

# In[12]:


start_index = title_index + len("<title>")
start_index


# Y el final con la barra ("/")

# In[9]:


end_index = html.find("</title>")
end_index


# Sacamos el titulo

# In[19]:


title = html[start_index:end_index]
title


# Probamos este sistema con una nueva página.  Si intentamos repetir lo mismo para Poseidon hay problemas.

# In[20]:


url = "http://olympus.realpython.org/profiles/poseidon"
page = urlopen(url)
html = page.read().decode("utf-8")
start_index = html.find("<title>") + len("<title>")
end_index = html.find("</title>")
title = html[start_index:end_index]
title


# Vemos que el titulo sale mal.

# Pasamos a ver la pagina

# In[21]:


print(html)
# Vemos que despues del titulo aparece un espacio.


# In[27]:


html.find("<title>")


# In[29]:


len('<title>')


# In[28]:


# Cuando buscamos el titulo devuelve un -1 porque no existe.
# El principio es 6
print(start_index)


# 
# El carácter en el índice 6 de la cadena html es un carácter de nueva <br>
# línea (\ n) justo antes del corchete de ángulo de apertura (<) de <br>
# la etiqueta <head>. Esto significa que html [start_index: end_index] <br>
# devuelve todo el HTML comenzando con esa nueva línea y terminando justo antes<br>
#  la etiqueta </title>.
# 

# Este tipo de cosas hay que evitarlas para lo que utilizamos expresiones regulares

# Importamos la libreria

# In[31]:


import re


# Vamos a ver un ejemplo.<br>
# Utilizamos findall() para buscar cualquier texto dentro de una cadena <br>
# que coincida con una expresión regular determinada

# In[32]:


re.findall("ab*c", "ac")


# En esta funcion el primer argumento es la expresion que se desea hacer coincidir.<br>
# El asterisco (*) representa cero o más de lo que viene justo antes del asterisco.<br>
# El segundo argumento es la cadena a probar.<br>
# Aqui se busca ab*c en la cadena ac (donde b puede aparecer o no en abcd)

# Mas ejemplos

# In[33]:


re.findall("ab*c", "abcd")


# In[34]:


re.findall("ab*c", "acc")


# In[35]:


re.findall("ab*c", "acd")


# In[36]:


re.findall("ab*c", "adc")


# In[37]:


re.findall("ab*c", "abcac")


# In[38]:


re.findall("ab*c", "abdc")


# Si no indicamos nada diferencia mayusculas

# In[39]:


re.findall("ab*c", "ABC")


# Pero podemos evitarlo

# In[40]:


re.findall("ab*c", "ABC", re.IGNORECASE)


# El patrón .* dentro de una expresión regular representa cualquier carácter repetido <br>
# cualquier número de veces. <br>
# Por ejemplo, "a. * C" se puede usar para encontrar cada subcadena que comience con "a" <br>
# y termine con "c", independientemente de la letra o letras que se encuentren entre ellas:<br>
# 

# In[41]:


re.findall("a.*c", "abc")


# In[42]:


re.findall("a.*c", "abbc")


# In[43]:


re.findall("a.*c", "ac")


# In[44]:


re.findall("a.*c", "acc")


# 
# <br>
# A menudo, usa re.search () para buscar un patrón particular dentro de una cadena. <br>
# Esta función es algo más complicada que re.findall () porque devuelve un objeto <br>
# llamado MatchObject que almacena diferentes grupos de datos. <br>
# Esto se debe a que puede haber coincidencias dentro de otras coincidencias<br>
# y re.search () devuelve todos los resultados posibles.<br>
# 

# In[45]:


match_results = re.search("ab*c", "ABC", re.IGNORECASE)
match_results.group()


# .group () en un MatchObject devolverá el primer y más inclusivo resultado (el qué más se ajuste a nuestra búsqueda)

# re.sub () permite reemplazar texto en una cadena que coincide con una <br>
# expresión regular con texto nuevo. En el ejemplo sustituimos desde el primer < hasta el último >
# Se sustituye <replaced> if it's in <tags> por ELEPHANTS
# .* busca la cadena más larga posible a sustituir   

# In[52]:


string = "Everything is <replaced> if it's in <tags>."
string = re.sub("<.*>", "ELEPHANTS", string)
string


# En este caso solo cambia el string que mas se le parezca.<br>
# Vemos que ocurre cambiando la palabra.

# In[47]:


string = "Everything is <replaced> if it's in <tags>."
string = re.sub("<.*>", "tac", string)
string


# Si queremos cambiar todas las ocurrencias donde tengamos texto entre < <, añadimos la interrogacion.<br>
# A través de .*? se busca el macheo más corto, al contrario que .* que busca el macheo más largo.
# Esto provoca que no busque el macheo

# In[53]:


string = "Everything is <replaced> if it's in <tags>."
string = re.sub("<.*?>", "ELEPHANTS", string)
string


# Una vez visto esto vamos a probar la siguiente pagina.<br>
# http://olympus.realpython.org/profiles/dionysus

# In[ ]:


import re
from urllib.request import urlopen


# Cargamos la pagina.

# In[54]:


url = "http://olympus.realpython.org/profiles/dionysus"
page = urlopen(url)
html = page.read().decode("utf-8")


# In[55]:


print(html)


# Vemos que presenta el mismo problema.<br>
# Lo solucionamos con lo visto

# In[56]:


pattern = "<title.*?>.*?</title.*?>"
match_results = re.search(pattern, html, re.IGNORECASE)
title = match_results.group()


# Visualizamos el titulo

# In[57]:


print(title)


# Eliminamos los marcadores

# In[58]:


title = re.sub("<.*?>", "", title)
# Visualizamos el titulo
print(title)


# EJERCICIO 1<br>
# Escriba un programa que tome el HTML completo de la siguiente URL<br>
# url = "http://olympus.realpython.org/profiles/dionysus"
