Esta es una breve explicación del codigo que se desarrollo a lo largo del curso, explicando el por qué y para qué de cada uno de las variables, métodos, objetos y librerias utilizadas.
-
Xpath - La Republica
Links = //div[@class="container"]//div[not(@class="V_Trends")]/h2/a/@href Título = //div[@class="mb-auto"]/h2/a/text() Resumen = //div[@class="lead"]/p/text() Cuerpo = //div[@class="html-content"]/p[not(@class)]/text(
-
Librerias utilizadas
import requests import lxml.html as html import os import datetime
- lxml → Convertir un archivo de texto HTML en un archivo de texto en el cual puedo aplicar xpath
- os → Crear una carpeta con la fecha actual
- datetime → Traer la fecha actual
-
Crear las constantes a partir de las expresiones xpath
HOME_URL = 'https://www.larepublica.co/' XPATH_LINK_TO_ARTICLE = '//text-fill[not(@class)]/a/@href' XPATH_TITLE = '//div[@class="mb-auto"]/text-fill/a/text()' XPATH_SUMMARY = '//div[@class="lead"]/p/text()' XPATH_BODY = '//div[@class="html-content"]/p[not(@class)]/text()'
- h2 = text-fill → Reemplaamos el h2 para que el xpath pueda ser interpretado por python
-
Enviar la solicitud HTTP a la web desde python para extraer los links de las noticias.
def parse_home(): try: response = requests.get(HOME_URL) if response.status_code == 200: home = response.content.decode('utf-8') parsed = html.fromstring(home) links_to_notices = parsed.xpath(XPATH_LINK_TO_ARTICLE) # print(links_to_notices) today = datetime.date.today().strftime('%d-%m-%Y') if not os.path.isdir(today): os.mkdir(today) for link in links_to_notices: parse_notice(link, today) else: raise ValueError(f'Error: {response.status_code}') except ValueError as ve: print(ve)
- Try & Except → Recomendado cuando hacemos solicitudes externas, por si la página envía como respuesta un status code de error nuestro código no se rompa
- response → Obtener el archivo html de la página
- If / else → Válida el status code de la solicitud a la web, si es 200, pudimos obtener el archivo html de la página y podemos continuar. Sí envia un status code diferente, lo tomá como error, muestra en pantalla el status code y el programa finaliza
- home → Método para transformar todos los caracteres especiales (ñ, tíldes, acentos) para que python pueda guardar correctamente el texto
- parsed → Toma el contenido de la variable home (archivo html de la web) y lo transforma en un documento en el cual puedo aplicar xpath
- links_to_notices → Contiene el resultudo de aplicar xpath, obtiene una lista de links
- today →
- datetime.date.today() → Módulo datetime maneja fechas, función date nos traer una fecha y today nos da la fecha de hoy. Guardamos dentro de la variable today un objeto de tipo fecha
- strftime(’%d-%m-%Y’) → Convierte el objeto tipo de fecha en una cadena de caracteres con el formato descrito en los parentesis
- if not os.path.isdir(today) → Nos devuelve un valor de true o false, busca en la carpeta en la que estamos (donde esta el archivo .py guardado)si existe una carpeta con el nombre de la variable que asignamos (today)
- os.mkdir(today) → Crea una carpeta con el nombre de la variable que asignamos (today), esto creará una carpeta con la fecha actual
-
Extracción de la información en cada una de las noticias
def parse_notice(link, today): try: response = requests.get(link) if response.status_code == 200: notice = response.content.decode('utf-8') parsed = html.fromstring(notice) try: title = parsed.xpath(XPATH_TITLE)[0] title = title.replace('\"', '') summary = parsed.xpath(XPATH_SUMMARY)[0] body = parsed.xpath(XPATH_BODY) except IndexError: return with open(f'{today}/{title}.txt', 'w', encoding='utf-8') as f: f.write(title) f.write('\n\n') f.write(summary) f.write('\n\n') for p in body: f.write(p) f.write('\n') f.write('\n\n\n') f.write(f'Link de la noticia: {link}') else: raise ValueError(f'Error: {response.status_code}') except ValueError as ve: print(ve)
- El primer Try & Except es el mismo de la funcion parse_home(), el segundo es para la extracción de la información de título, resumen y cuerpo
- If / else → Válida el status code de la solicitud a la web, si es 200, pudimos obtener el archivo html de la página y podemos continuar. Sí envia un status code diferente, lo tomá como error, muestra en pantalla el status code y el programa finaliza
- title → Contiene el resultudo de aplicar xpath y se obtiene una lista valores, agregamos [0] ya que solo queremos el valor(texto) del título.
Después reemplazamos ‘’ con un campo vacio ‘’ - summary → Misma lógica que la variable title
- body → Misma lógica que laa variables title y summary, solo que aqui no especificamos una posición para retornar el valor, ya que pueden haber más de un párrafo
- with open → With, manejador contextual que mantiene los archivos de manera segura, open permite abrir archivos
- ‘{today}/{title}.txt’ → El primer argumento que se le da a open es el nombre del archivo con el cual voy a trabajar, en este caso, el archivo se escribirá en la carpeta con la fecha actual (today), recibira el nombre del título de la noticia (title) y será un archivo de texto plano .txt
- ‘w’ → Write indica que escribiremos dentro de un archivo, si no está creado, este argumento lo creará
- f.write(title) / f.write(summary) → la función write escribe las variables que se le indiquen, en este caso el título y el resumen
- for p in body: f.write§ → Debido a que puede haber más de un párrafo, creamos un for que recorra la lista de párrafos y vaya escribiendo uno por uno
- f.write(f’Link de la noticia: {link}’) → Escribe el link de la noticia
- f.write(’\n’) → Saltos de linea, cada \n que se le agregue es un salto más.
Curso de Fundamentos de Web Scraping con Python y Xpath
0 Comentarios
para escribir tu comentario