No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Descargando contenido

8/30
Recursos

Aportes 81

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?


try:
    nota = requests.get(url_nota)
    if nota:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        
         # Extraer un titulo
        titulo = s_nota.find('h1', attrs = {'class':'article-title'})
        print(titulo.text)
        print('\n')
        
        # Extraer la fecha
        fecha = s_nota.find('span', attrs={'pubdate': 'pubdate'}).get('datetime')
        print(fecha)
        print('\n')
        
        # Volanta
        volanta = s_nota.find('h2', attrs={'class':'article-prefix'})
        print(volanta.text)
        print('\n')
        
        #copete, aveces está
        try:
            
            copete = s_nota.find('div', attrs={'class': 'article-summary'})
            print(copete.text)
            print('\n')
            
        except:
            print(None)
            print('\n')
        
        #autor
        autor = s_nota.find('div', attrs={'class':'article-author'}).a
        print(autor.text)
        print('\n')
        
        #texto
        texto = s_nota.find('div', attrs={'class':'article-text'}).find_all('p')
        articulo_texto = ''
        for pedazo_texto in texto:
            articulo_texto += pedazo_texto.text
        
        print(articulo_texto)
        
        
        
        
except Exception as e:
    print('Error')
    print(e)
    print('*'*50)
    print('\n')

He llegado hasta esta clase y ya pude hacer mi scraper para obtener el precio promedio de una tabla en mysql de ciertos productos.
El link se arma obteniendo el producto de la tabla.
Luego obtiene el precio promedio de la primera página (validando que sea la moneda que yo quiero).
Luego obtengo el precio promedio de todos los precios y ese precio promedio se actualiza en el precio de la tabla por cada id (producto).
Un tema muy interesante y con muchas posibilidades. Ahora trataré de hacer un histórico de los precios de los productos más famosos para ver su variación en el tiempo y compararlo a la fecha de black friday.

<try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        #Extraemos el titulo 
        titulo = s_nota.find('div', attrs = {'class':'col 2-col'}).find('h1')
        print(titulo.text)
        #Extraer la fecha
        fecha = s_nota.find('time').get('datetime')
        print(fecha)
        #Extraer copete
        for copete in s_nota.find('div', attrs = {'class':'article-tags'}).find_all('a'):
            print(copete.get_text())
        #Extraer volanta
        volanta = s_nota.find('div', attrs = {'class':'col 2-col'}).find('h4')
        print(volanta.text)
        #Extraer cuerpo
        cuerpo = s_nota.find('div', attrs = {'class':'article-text'}).find('p')
        print(cuerpo.text)
        #Extraer autor
        autor = s_nota.find('ul', attrs = {'class':'list column small-12'}).find('a')
        print(autor.get_text())     
         
except Exception as e:
    print('Error')
    print(e)
    print('\n') > 

Reto cumplido!!

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        #Extraer el titulo
        titulo = s_nota.find('h1', attrs={'class':'article-title'}).get_text()
        print(titulo)
        
        # EXtraer la fecha
        Fecha = s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(Fecha)
        
        # Extraer Volanta
        volanta = s_nota.find('h2', attrs={'class':'article-prefix'}).get_text()
        print(volanta)
        
        # Extraer cuerpo
        Cuerpo = s_nota.find('div', attrs={'class':'article-text'}).get_text()
        print(Cuerpo)
except Exception as e:
    print("Error")
    print(e)
    print('\n')

Una vez descargada la data, es conveniente pasarlo a una base de datos o como?

# Scraper para la nota (noticia)

try:
    nota = requests.get(url_nota_0)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        
        print('Título: ')
        # Extraer el título
        titulo = s_nota.find('div', attrs={'class': 'col 2-col'}).h1.get_text()
        print(titulo)
        
        # Extraer la fecha
        fecha = s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(fecha)
        
        print('\n Copete: ')
        # Extraer el copete o bajada
        copete = s_nota.find('div', attrs={'class': 'col 2-col'}).h3.get_text()
        print(copete)
        
        print('\n Volanta: ')
        # Extraer la volanta
        volanta = s_nota.find('div', attrs={'class': 'col 2-col'}).h4.get_text()
        print(volanta)
        
        print('\n Cuerpo:')
        # Extraer el cuerpo de la noticia
        cuerpo = s_nota.find('div', attrs={'class': 'article-main-content article-text'}).find_all('p')
        cuerpo_text = [parrafo.getText() for parrafo in cuerpo]
        
        for parrafo in cuerpo_text:
            print(parrafo)
            print('\n')
        
except Exception as e:
    print('Error: ')
    print(e)
    print('\n')
try:
    nota = requests.get(url_nota)
    if nota.status_code ==200:
        
        #Exteaer Volanta
        s_nota = BeautifulSoup(nota.text,'lxml')
        volanta = s_nota.find('h2', attrs={'class':'article-prefix'})
        print(volanta.text)
        
        #Extraer el titulo
        titulo = s_nota.find('div', attrs = {'class':'article-title'})
        print(titulo.text)
        
        #Extraer cuerpo
        cuerpo = s_nota.find('div', attrs={'class':'article-text'})
        print(cuerpo.text)
        
        #Extraer texto de imagen
        texto_imagen= s_nota.find('span', attrs ={'class':'article-main-media-text-image'})
        print(texto_imagen.text)
        
        #Extraer fecha
        fecha = s_nota.find('span', attrs={'pubdate':'pubdate'}).get("datetime")
        print(fecha)
        
        #Extraer autor
        autor = s_nota.find('div', attrs={'class':'article-author'})
        print(autor.text)
              
except Exception as e:
    print('Error:')
    print(e)
    print('\n')```

Mi pieza, sin embargo no encontré el autor de los artículos.

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        
        #Date extraction
        date = s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(date)
        print('\n')
        
        #Article prefix extraction
        aprefix = s_nota.find('h2', attrs={'class':'article-prefix'}).get_text()
        print(aprefix)
        print('\n')
        
        #Title extraction
        title = s_nota.find('h1', attrs={'class':'article-title'}).get_text()
        print(title)
        print('\n')       
        
        #Article summary extraction
        summary = s_nota.find('div', attrs={'class':'article-summary'}).get_text()
        print(summary)
        print('\n')       
        
        #Article body extraction
        body = s_nota.find('div', attrs={'class':'article-text'}).get_text()
        print(body)
        
        
except Exception as e:
    print('Error:')
    print(e)
    print('\n')

comparto lo que llevo de codigo hasta ahora, cumpliendo el reto de esta clase, he añadido la funcion parse_notice() la cual extraes todo el contenido de la noticia, sin embargo me encontre con un obstaculo en el proceso, al momento de la extracion del contenido del articulo note que algunas noticias no son solo texto plano, aveces presentaan subtitulos con etiquetas h2,h3,h4 etc y algunos hashtags(#), esto complico un poco la extracion del texto, pues al usar la funcion .text en el sopu correspondiente, se obteni un texto bastante ilegible, por la presencia de otras etiquetas. leyendo la documentacion de BeautifulSoup, encontre el metodo .get_text(), que si se le asigna el parametro adecuado puedes extraer todo el texto contenido en el div que tiene el contenido de la noticia, ignorando las etiquetas h3,h2, b, etc…, asi se obtiene un texto mas leible, sin embargo aun no se logra identificar muy bien que partes del texto corresponden a subtitulos o hastags

import requests
from bs4 import BeautifulSoup

URL='https://www.pagina12.com.ar/'


def parse_notices(link_notice): #esta funcion extrae titulo, volanta, copete, contenido y autor de la noticia
    try:
        note=requests.get(link_notice)
        if note.status_code==200:
            html_note=BeautifulSoup(note.text, 'lxml')
            #extraemos el titulo
            title=html_note.find('h1', attrs={'class':'article-title'}).text
            print(f'Titulo de la noticia: {title}')

            #extraemos la fecha del articulo
            fecha=html_note.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
            print(f'Fecha de publicacion: {fecha}')

            #si la noticia incluye una volanta, la extraemos
            try:
                volanta=html_note.find('h2', attrs={'class':'article-prefix'}).text
                print(f'Volanta: {volanta}')
            except Exception as e:
                print('Error: esta noticia no tiene volanta')
                print(e)
                print('\n')

            #si la noticia incluye un copete, lo extraemos
            try:
                copete=html_note.find('div', attrs={'class':'article-summary'}).text
                print(f'Copete: {copete}')
            except Exception as e:
                print('Error: esta noticia no tiene copete')
                print(e)
                print('\n')

            body=html_note.find('div', attrs={'class':'article-text'}).get_text(' ')
            print('Contenidp de la noticia: ')
            print(body)

            #extraemos el author, si es que lo tiene
            try:
                author=html_note.find('div', attrs={'class':'article-author'}).a.text
                print(f'Articulo escrito por: {author}')
            except Exception as e:
                print('Error: esta noticia no tiene un autor')
                print(e)
                

        else:
            raise Exception(f'{note.status_code}')

    except Exception as e:
        print('Error: ')
        print(e)
        print('\n')

def parse_sections(link_section):
    try:
        response_link_section=requests.get(link_section)
        if response_link_section.status_code==200:
            html_section=BeautifulSoup(response_link_section.text, 'lxml')
            articles=html_section.find_all('div', attrs={'class': 'article-item__content'})
            # print(articles)

            links_to_news=[article.a.get('href') for article in articles]
            # return links_to_news
            print(links_to_news)
            print('')
            print('***********Extracion toda la info de la noticia********\n')
            parse_notices(links_to_news[0])
        else:
            raise ValueError(f'Error en la request, status_code: {response_link_section.status_code}')

    except ValueError as ve:
        print(ve)

def parse_home_p12(url):
    try:
        response_p12=requests.get(url)
        if response_p12.status_code==200:
            html_home=BeautifulSoup(response_p12.text, 'lxml')
            # print(html_home.prettify())

            sections=html_home.find('div', attrs={'class':'p12-dropdown-content'}).find_all('a', attrs={'class':'p12-dropdown-item'})
            links_to_sections =[section.get('href') for section in sections]
            # return links_to_sections
            # print(links_to_sections)
                        
            print('\n***********extrayendo los links de las noticias***********\n')
            parse_sections(links_to_sections[0])

        else:
            raise ValueError(f'Error: {response_p12.status_code} ')
    except ValueError as ve:
        print('ve')

def run():
    parse_home_p12(URL)
if __name__ == '__main__':
    run()

les comparto mi repositorio, y quedo atento a cualquier feedback

primera_url = lista_notas[0]
try:
    nota = requests.get(primera_url)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        
        #Extracción del title
        title = s_nota.find('div', attrs={'class':'article-titles'}).find('h1').get_text()
        print(title)
        
        #Extraer Fecha article
        fecha = s_nota.find('span', attrs={'pubdate':'pubdate'} ).get('datetime')
        print(fecha)
        
        #Extraer Volanta (MiniTitulo)
        volanta = s_nota.find('h2', attrs ={'class':'article-prefix'}).get_text()
        print(volanta)
        
        #Extraer Cuerpo
        body = s_nota.find('div', attrs ={'class':'article-text'}).get_text()
        print(body)
        
except Exception as e:
    print('Error: ')
    print(e)
    print('\n')

Mi código al 26/04/2022

import requests
from bs4 import BeautifulSoup
import lxml
import re

url = "https://www.pagina12.com.ar"
response = requests.get(url)
#response.status_code, response.text, response.content
#response.headers, response.request.headers, response.request.method

soup = BeautifulSoup(response.text, 'lxml') #type(s), print(s.prettify())

# Every section is inside a il that is inside a ul. (Find) only returns the first tag
sections = soup.find('ul', attrs={'class':'horizontal-list main-sections hide-on-dropdown'}).find_all('li')

sections_links = [section.a.get('href') for section in sections]
#print(sections_links)
sections_titles = [section.a.text for section in sections]
#print(sections_titles)

def build_link(url, link):
    is_well_formed_link = re.compile(r'^https?://.+/.+$')
    is_root_path = re.compile(r'^/.+$')
    
    if is_well_formed_link.match(link):
        return link
    elif is_root_path.match(link):
        return f'{url}{link}'
    else:
        return f'{url}/{link}'

def clean_text(text):
    return text.replace("\xa0", "").replace("\n", "")

def get_response(url):
    try:
        return requests.get(url)
    except Exception as e:
        print("Error at get_response: ",e)

def get_soup(response):
    # Soup object
    return BeautifulSoup(response.text, 'lxml')

def get_articles_links(soup):

    articles_links = []
    
    # Get the featured article of the section 
    # by searching the FIRST div with class = article-item__content
    featured_article = soup.find('div', attrs={'class':'article-item__content'})
    
    if featured_article:
        featured_article_link = build_link(url,featured_article.a.get('href'))
        articles_links.append(featured_article_link)
    
    # The remaingin articles are in different group of divs
    article_groups = soup.find_all('div', attrs={'class':'articles-list'})
    
    for group in article_groups:
        # All the articles of the group
        articles = group.find_all('article', attrs={'class':'article-item'})
        # Loop for every article
        for article in articles:
            # The div that has the article inside
            div_of_article = article.find('div', attrs={'class':'article-item__content-footer-wrapper'})
            article_link = build_link(url, div_of_article.a.get('href'))
            articles_links.append(article_link)
    
    # Special case for the 'cultura y espectaculos' section
    if not articles_links:
        # All the articles
        articles = soup.find_all('div', attrs={'class':'article-box__container'})
        # Loop for every article
        for article in articles:
            article_link = article.h2
            article_link = build_link(url, article_link.a.get('href'))
            articles_links.append(article_link)        
    
    # Returns a list
    return articles_links

def get_article_title(soup):
    try:
        title = soup.find('div', attrs={'class':'content'}).h1.text
        title = clean_text(title)
        if title:
            return title
        else:
            return "No title."
    except Exception as e:
        print("Error getting the article title: ", e)

def get_article_date(soup):
    try:
        date = soup.find('div', attrs={'class':'date modification-date'}).span.time.text
        if date:
            return date
        else:
            return "No date."
    except Exception as e:
        print("Error getting the article date: ", e)    

def get_article_copete(soup):
    try:
        copete = soup.find('div', attrs={'class':'content'}).h3.text
        copete = clean_text(copete)
        if copete:
            return copete
        else:
            return "No copete."
    except Exception as e:
        print("Error getting the article copete: ", e)        

def get_article_volanta(soup):
    try:
        volanta = soup.find('div', attrs={'class':'content'}).h4.text
        volanta = clean_text(volanta)
        if volanta:
            return volanta
        else:
            return "No volanta."
    except Exception as e:
        print("Error getting the article volanta: ", e)        

def get_article_body(soup):
    try:
        body = soup.find('div', attrs={'class':'article-main-content article-text'})
        body_text = ""
        if body:
            for p in body:
                body_text = body_text + p.text
            body_text = clean_text(body_text)
            return body_text
        else:
            return "No body."
    except Exception as e:
        print("Error getting the article body: ", e)  

def get_article_author(soup):
    try:
        author = soup.find('div', attrs={'class':'author-name'})
        if author:
            author = clean_text(author.text)
            return author
        else:
            return "No author."
    except Exception as e:
        print("Error getting the article author: ", e)  

for section in sections_links:
    articles_titles = []
    articles_dates = []
    articles_copetes = []
    articles_volantas = []
    articles_bodys = []
    articles_authors = []
    
    # Get the response
    section_response = get_response(section)
    
    if section_response.status_code == 200:
        # Only execute if the response status code was ok
        section_soup = get_soup(section_response)
        articles_links = get_articles_links(section_soup)

        print("\n\n- Section: ", section)
        print("- Response: ", section_response.status_code)
        
        # Get articles info
        for article_link in articles_links:
            
            article_response = get_response(article_link)
            if section_response.status_code == 200:
                article_soup = get_soup(article_response)
                
                title = get_article_title(article_soup)
                articles_titles.append(title)
                #print("Title: ", title)
            
                date = get_article_date(article_soup)
                articles_dates.append(date)
                #print("Date: ", date)

                copete = get_article_copete(article_soup)
                articles_copetes.append(copete)
                #print("Copete: ", copete)

                volanta = get_article_volanta(article_soup)
                articles_volantas.append(volanta)
                #print("volanta: ", volanta)

                body = get_article_body(article_soup)
                articles_bodys.append(body)
                #print("body: ", body)

                author = get_article_author(article_soup)
                articles_authors.append(author)
                #print("author: ", author)
                
            else:
                print("Error status code: ",section_response.status_code)
                
        #print("- Titles: ", articles_titles)
        #print("- Dates: ", articles_dates)
        #print("- Copetes: ", articles_copetes)
        #print("- Volantas: ", articles_volantas)
        #print("- Bodys: ", articles_bodys)
        #print("- Authors: ", articles_authors)
    else:
        print("Error status code: ",section_response.status_code)
        
#IN
'''
import requests
from bs4 import BeautifulSoup
# Selección de dirección
ulr='https://www.pagina12.com.ar/'
seccion='hot-sections'
sub_seccion='Economía'
def links_articulos(ulr,seccion,sub_seccion):
    # obtiene la pagina web
    web_page=requests.get(ulr)
    if web_page.status_code == 200:
        s1=BeautifulSoup(web_page.text,'lxml')
        # obtiene los links y nombres de la seccion
        secciones= s1.find('ul', attrs={'class':seccion}).find_all('li')
        links_secciones=[seccion.a.get('href') for seccion in secciones]
        nombres_secciones= [seccion.a.get_text() for seccion in secciones]
        # busca la posicion del link de la sub_seccion elegida
        pos=nombres_secciones.index(sub_seccion)
        # obtiene la pagina web de la sub_seccion
        sub_seccion_request=requests.get(links_secciones[pos])
        s2=BeautifulSoup(sub_seccion_request.text,'lxml')
        # obtiene los links de las sub_seccion elegida
        secciones= s2.find('ul', attrs={'class':'article-list'}).find_all('h2')
        links_secciones=[seccion.a.get('href') for seccion in secciones]
        return links_secciones
    else:
        print('Error de obtencion de pagina web')
#Manejo de errores
try:
    ulr_notas=links_articulos(ulr,seccion,sub_seccion)
    ulr_nota=ulr_notas[1]
    print(ulr_nota)
    print('\n')
    nota=requests.get(ulr_nota)
    #Revisa la correcta adquicision de la pagina web
    if nota.status_code == 200:
        s_nota=BeautifulSoup(nota.text,'lxml')
        Titulo=s_nota.find('div', attrs={'class':'article-title'})
        print('Titulo: ' + Titulo.text)
        Fecha=s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print('Fecha: ' + Fecha)
        Volanta=s_nota.find('div',attrs={'class':'article-prefix'})
        print('Volanta: ' + Volanta.text)
        Resumen=s_nota.find('div',attrs={'class':'article-summary'})
        print('Resumen: ' + Resumen.text)
        Parrafos=s_nota.find('div', attrs={'class':'article-text'}).find_all('p')
        print('Cuerpo: ')
        for Parrafo in Parrafos:
            print(Parrafo.text)
        autor = s_nota.find('div', attrs={'class': 'article-author'})
        print('autor: ' + autor.text)
    else:
        print('Error de obtencion de pagina web')

except Exception as e:
    print('Error:')
    print(e)
    print('\n')

#OUT
https://www.pagina12.com.ar/244051-el-martirio-de-los-prestamos-uva


Titulo: El martirio de los préstamos UVA
Fecha: 2020-01-27
Volanta: Temas de debate: Alternativas para desindexar el crédito en la Argentina
Resumen: Esta semana se vence el congelamiento en las cuotas que dispuso el gobierno nacional. Expertos opinan cómo salir de un sistema que resultó un fracaso por la elevada inflación.
Cuerpo: 
Producción: Florencia Barragán
-------------------------------------------------------------------------------------------------------------------------------
Marcelo Mercere (*)
Uno de los índices a los que suele apelarse al momento de evaluar un instrumento financiero es el de morosidad. Dependiendo de su comportamiento, se manifesta que el mismo es bajo, y que por lo tanto no requiere atención, o que es alto, y por ello resulta necesario tomar medidas para atacar sus causas.
Los créditos hipotecarios indexados por inflación (UVA), tendrían bajo ese prisma un índice de morosidad bajo y por lo tanto, no requerían de ninguna atención especial por parte del sistema financiero y del Estado. Las cifras señalan que la morosidad en estos créditos es muy baja, no obstante haberse duplicado en tres meses. Como sucede habitualmente, detrás de una cifra se esconde una realidad un tanto más ominosa que refleja, cuál es realmente la situación de los hipotecados.
Las estadísticas del Banco Central no toman en cuenta los préstamos asociados a estos créditos, los cuales, en algunos casos, se encuentran dentro del sistema financiero (personales, financiación con tarjetas de créditos), pero muchos otros no (préstamos con familiares directos y los préstamos por fuera del sistema financiero). Esa sumatoria de créditos, provocan en las economías familiares un verdadero estrago que se traduce en pérdida en calidad de vida.
Ese índice de “calidad de vida”, no cotiza en el mercado y por ello resulta dificultoso mensurarlo y traducirlo en términos porcentuales. Es por ello qué los hipotecados sostenemos que nos encontramos sobre endeudados. El sobre endeudamiento ha sido definido como aquél estado en el que cae un consumidor de buena fe -en este caso los deudores hipotecarios-, ante la manifiesta imposibilidad de hacer frente a un conjunto de deudas exigibles.
Estos créditos fueron impulsados desde el Estado Nacional hacia fines de marzo de 2016. Toda la maquinaria publicitaria estatal y del sistema financiero fue puesta a disposición para promocionar los créditos indexados por inflación. Desde el propio Banco Central se sostenía que la cuota se mantendría estable en relación a los ingresos, a lo largo de todo el crédito.
El argumento principal para promocionar estos créditos era que La Argentina iba hacia un esquema de metas de inflación que permitiría reducir el incremento de los precios a niveles cercanos al 5 por ciento en 2019; es decir la inflación convergería hacia índices propios de los países desarrollados. Claramente se trató de publicidad engañosa, sancionable en los términos de la Ley de Defensa del Consumidor.
El año 2019 finalizó con una inflación anual superior al 50 por ciento, la más alta de los últimos 28 años. En simultáneo, el poder adquisitivo de los salarios se redujo un 20 por ciento entre 2016 y 2019. Ello demuestra que no es viable impulsar créditos indexados en un país que padece estos niveles de inflación. Frente a ello, es necesario barajar y dar de nuevo procediendo a una reestructuración de los créditos indexados, transformando los mismos en instrumentos previsibles que brinden certeza sobre la cuota a pagar y el capital adeudado. Es necesario salir de la indexación.
El endeudamiento excesivo que conllevan estos créditos no pudo ser razonablemente previsto por el deudor al momento de firmar. La revisión de los contratos cuyo equilibrio se encuentra fracturado, es un imperativo que no admite dilaciones para volver al equilibrio inicial en las prestaciones de estos contratos. Caso contrario, se irá hacia una explosión de los niveles de morosidad, con el riesgo cierto de caer en ejecuciones masivas por la imposibilidad cierta de afrontar las cuotas.
No debemos olvidar la pauta constitucional que fija el artículo 14 bis, que contempla la protección de la familia y el acceso a una vivienda digna. Estos derechos también se encuentran tutelados por los Tratados internacionales incorporados a la carta magna. Ante la posibilidad cierta de que los derechos contemplados en la Constitución Nacional y en los Tratados Internacionales se conviertan en letra muerta, es menester que el Estado no se comporte como un mero espectador -aduciendo que sólo se trata de una “cuestión entre privados”-, y asuma la responsabilidad que le compete junto al sector financiero, en tanto promotores de un sistema de créditos que no ha arrojado los resultados esperados.
* Abogado e Integrante del Colectivo Hipotecados UVA Autoconvocados.
-------------------------------------------------------------------------------------------------------------------------------
Por Federico González Rouco (**)
A casi cuatro años de la creación de la UVA, podríamos decir que pasamos por varias etapas, como con todo lo nuevo. Es momento de hacer un balance y repensar cómo seguir con el crédito hipotecario. El gobierno aún no presentó un camino claro de cómo abordará la situación habitacional. Aprovechando este momento de transición, creo oportuno presentar una propuesta de cómo seguir: ¿Y si las cuotas ajustan como el promedio de los salarios?
Desde un primer periodo de conocimiento, allá por principios de 2016, cuando durante varios meses había intriga e incertidumbre sobre cómo funcionaba el sistema UVA, qué significaba y qué iba a pasar, pasamos a un momento de vértigo en el sistema hipotecario que rompió récords y, quizás por lo que alto que subió, la etapa siguiente, la de pesimismo, fue tan fuerte y generó este nubarrón de escepticismo que hoy vemos. Hoy, a cuatro años, estamos preparados para seguir adelante, reconociendo lo positivo, incorporando lo negativo y, ojalá, listos para profundizar y continuar ampliando el acceso a la vivienda a través del crédito hipotecario.
La UVA permitió facilitar el acceso al crédito hipotecario al reducir las barreras de entrada. Entre 2014 y 2015, una familia necesitó ingresos equivalentes a entre 16 y 18 salarios mínimos para acceder a una vivienda. Ni siquiera los hogares que pertenecían al decil de mayores ingresos (quienes ganaban más que el 90 por ciento restante) podían acceder, dado que sus ingresos eran equivalentes a alrededor de 7,5 salarios mínimos. Con la creación de la UVA la relación entre el salario mínimo y los ingresos de los hogares no cambió, pero se redujo casi 70 por ciento el ingreso requerido para sacar un crédito hipotecario. Eso les abrió la puerta a muchas familias. Cuando, además, el Banco Nación se puso el sistema al hombro, vimos cómo se daban 10.000 créditos hipotecarios por mes y se rompían récords de décadas.
Después, con la sucesión de saltos del dólar a partir de mediados de 2018, el acceso se complicó y el ingreso necesario para acceder se duplicó en términos de los ingresos de los hogares. Seguía siendo más fácil que en 2014 o 2015, pero prohibitivo al fin. A futuro, entonces, debemos incorporar esta lección: podemos bajar las barreras de entrada, pero el contexto reina.
Por otro lado, ya sabiendo que el sistema UVA facilita la entrada, vale la pena pensar en los que están adentro. Son cerca de 115.000 familias. Menos del 1 por ciento (0,6 por ciento para ser exacto) están con atrasos en el pago de la deuda, pero esto no quita que el resto no esté realizando fuertes sacrificios para pagarlas. Las cuotas subieron, al evolucionar como lo hacen los precios, más que los salarios, presumiblemente, para la mayoría de los deudores. Quienes comenzaron pagando una cuota equivalente al 25 por ciento del ingreso familiar hoy están pagando, si su ingreso se actualizó como el promedio, alrededor de 27 o 29 por ciento, dependiendo de cuánto sacaron el crédito.
Aquí es donde, quizás, más margen hay para fortalecer el sistema y llevarlo a una segunda etapa, que se apoye sobre lo bueno e incorporé los problemas. Este sistema, usado en muchos países de América Latina, tiene sentido en contexto inflacionarios. Dicho eso, y pensando en la actualidad local, podríamos pensar en alternativas para que, sin generar distorsiones que compliquen la oferta de créditos, impulsen a las familias a tomar créditos.
Una propuesta es que las cuotas evolucionen como el salario promedio. Esto no quiere decir que la UVA cambie su naturaleza, sino agregarle al sistema un componente, similar a un seguro o un fondo de compensación, que permita reducir las volatilidades si es que el salario y la inflación evolucionar de manera muy diferente. Es decir, si el salario real (el salario ajustado por inflación) es estable, no hay nada para hacer. Ahora, si el salario real cae, se podría diseñar una manera para que el deudor pague según lo que sube el salario y el acreedor (el banco) cobre según la inflación. Para esto, el deudor debería pagar mensualmente un extra en concepto de “seguro”, aunque no lo sea técnicamente. Los pagos mensuales a este “seguro” van a un fondo que cubre las diferencias cuando haga falta.


El sistema funciona, 115.000 familias hoy son propietarias gracias a él aun con la situación macroeconómica que vivimos en la última década. Con un Ministerio que sigue creándose, como el sistema UVA, quizás puedan ir de la mano y tomar esto como un pilar de la gestión.
**Economista y docente de la Universidad Católica Argentina.
autor: Por Pablo Fornero
'''

Acá comparto mi código tal como lo hice

try:
    note = requests.get(note_url)
    if note.status_code == 200:
        s_note = BeautifulSoup(note.text, 'lxml')
        # Extracting title
        title = s_note.find('h1', attrs={'class': 'article-title'})
        print(title.text)
        
        # Extracting date
        date = s_note.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(date)
        
        # Extracting volanta
        volanta = s_note.find('h2', attrs={'class':'article-prefix'})
        print(volanta.text)
        
        # Extracting copete
        copete = s_note.find('div', attrs={'class':'article-summary'})
        print(copete.text)
        
        # Extracting body
        body = s_note.find('div', attrs={'class':'article-text'})
        
        print(body.text)
except Exception as e:
    print('Error: ')
    print(e)
    print('\n')

No saqué el autor del artículo que estaba haciendo scraping porque no tenía pero vi que compañeros como Dickson Garcia le dieron solución y me parecen realmente interesantes.

try:
    note = requests.get(url_note)
    if note.status_code ==200:
        soup_note = BeautifulSoup(note.text,'lxml')
        
        #Extract title
        title=soup_note.find('h1',attrs={'class':'article-title'})
        print(f'Titulo: {title.get_text()} \n')
        #print(title.text)
        
        #Extract date
        date = soup_note.find('span',attrs={'pubdate':'pubdate'}).get('datetime')
        print(f'Fecha: {date} \n')
        
        #Extract VOLANTA
        volanta = soup_note.find('h2',attrs={'class':'article-prefix'})
        print(f'Volanta: {volanta.text} \n')
        
        #Extract Copete
        copete = soup_note.find('div',attrs={'class':'article-summary'})
        print(f'Copete: {copete.text} \n')
        
        #Extract body
        body_paragraph = soup_note.find('div',attrs={'class':'article-text'}).find_all('p')
        paragraph = [p.text for p in body_paragraph]
        txt = '\n '.join(paragraph)
        print(txt)
        
        #Extract Author
        author = soup_note.find('div',attrs={'class':'article-author'}).find('a')
        print(f'Autor: {author.text} \n')
    
except Exception as e: 
    print('Error:')
    print(e)
    print('\n')

Les comparto el código y tags que me funcionaron en Abril del 2021.

Saludos.

try:
  nota=requests.get(url_nota)
  if nota.status_code==200:
    s_nota=BeautifulSoup(nota.text,'lxml')
    #Title extraction
    title=s_nota.find('div',attrs={'class':'col 2-col'}).find('h1').get_text()
    print(title)
    #date extraction
    date=s_nota.find('span',attrs={'pubdate':'pubdate'}).get('datetime')
    print(date)
    #copete extraction
    copete=s_nota.find('div',attrs={'class':'col 2-col'}).find('h3').get_text()
    print(copete)
    #volanta extraction
    volanta =s_nota.find('div',attrs={'class':'col 2-col'}).find('h4').get_text()
    print(volanta)
    #body extraction
    body=[content.get_text() 
          for content in 
          s_nota.find('div',attrs={'class':'article-main-content article-text '}).find_all('p')]
    body=' '.join(body)
    print(body)
    #author extraction
    author=s_nota.find('div',attrs={'class':'author-name'}).get_text()
    print(author)
except Exception as e:
  print('Error: ')
  print(e)
  print('\n') 

Mi solución al reto en abril de 2023

try:
    nota = requests.get(pagina)
    if nota.status_code ==200: 
        s_nota = BeautifulSoup(nota.text, 'lxml')
        #Extraemos el titulo
        title = s_nota.find('div', attrs= {'class':'col 2-col'}).h1.get_text()
        #extraer la fecha del articulo
        date = s_nota.find('div', attrs = {'class':'date'}).find('span', attrs= {'class':'p12-separator--right--blue'}).text
        #copete
        copete = s_nota.find('h2', attrs = {'class':'h3'}).get_text()
        #Volante
        volante = s_nota.find('h2', attrs = {'class':'h4'}).get_text()
        #cuerpo
        cuerpo = s_nota.find('div', attrs = {'class':'section-2-col article-main-content'}).find_all('p')
        cuerpo_entero = [parrafo.get_text() for parrafo in cuerpo]
        #autor
        author = s_nota.find('div', attrs = {'class': 'author-name'}).get_text()
       
except Exception as ve:
    print(f'Error: {ve}')
    print('\n')

16/08/23
les presento el reto resuelto:

try:
    nota=requests.get(url_nota)
    if nota.status_code== 200:
        s_nota = BeautifulSoup (nota.text, 'lxml')
        #extraemos el titulo
        titulo = s_nota.find('h1')
        print(titulo.text)
        #extraemos la fecha
        fecha= s_nota.find('time').get('datetime')
        print(fecha)
        #volanta
        volanta=s_nota.find('h2')
        print (volanta.text)
        #contenido
        contenido=s_nota.find('div', attrs={'class': 'article-main-content article-text'})
        print(contenido.text)
except Exception as e:
    print('error en la request')
    print (e)
    print('\n')

Javier Milei descartó un acuerdo con Juntos por el Cambio y confirmó que se reunirá con el FMI
2023-08-17T00:01:00-03:00
La justificación del “plan motosierra”
“La diferencia entre un loco y un genio es el éxito. El 22 de octubre hablamos, si soy un genio o un loco”, dijo envalentonado Javier Milei tras el triunfo en las PASO. En una entrevista televisiva, el candidato de La Libertad Avanza descartó una alianza con Patricia Bullrich en la provincia de Buenos Aires e insistió en la eliminación de once ministerios y la privatización del Conicet. Además, confirmó que mañana tendrá un encuentro virtual con el Fondo Monetario Internacional.“No existe ese acuerdo. No hay ninguna forma de acuerdo con Juntos por el Cambio”, remarcó Milei y desechó un pacto entre su candidata a gobernadora bonaerense, Carolina Piparo, y el postulante de Juntos por el Cambio, Néstor Grindetti, para vencer a Axel Kicillof. “Estamos preparados para ganar la provincia. Si están preocupados porque se gana o se pierde por un voto, que se bajen ellos”, agregó.Sobre el programa de ajuste feroz, volvió a explicar que eliminará más de una decena de ministerios, entre otros el de Salud, que en caso de ser electo, lo reducirá a secretaría de una cartera llamada Capital Humano. “Este gobierno puso un ministerio de Salud y tendríamos que haber tenido 30 mil muertos por covid, acorde a un país mediocre, y tuvimos 130 mil. Tener un ministerio no modificó eso”, señaló. Siguiendo con la poda, justificó la privatización del Conicet, al indicar que tiene “35 mil personas” en comparación con la NASA que tiene “17 mil personas”. “La productividad del Conicet es bastante cuestionable”, indicó. Respecto a un eventual ministerio de Defensa y Seguridad, confirmó que será manejado por su candidata a vicepresidenta, la negacionista Victoria Villarruel.Por último, confirmó que mañana a las 10 de la mañana mantendrá un contacto con autoridades del Fondo Monetario Internacional. “Nosotros no tenemos un problema con el FMI porque nuestras metas fiscales son más ambiciosas que las del propio Fondo”, concluyó.

Las estructuras parece que cambian constantemente, pero aquí dejo el reto:

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        # Extraer el título
        title_nota = s_nota.find('h1', attrs = {'class':'article-title'}).text
        print(title_nota)
        print('\n')
        
        date_nota = s_nota.find('div', attrs = {'class':'time'}).find('span', attrs = {'pubdate':'pubdate'}).get('datetime')
        print(date_nota)
        print('\n')
        
        copete_nota = s_nota.find('div', attrs = {'class':'article-summary'}).text
        print(copete_nota)
        print('\n')
        
        volanta_nota = s_nota.find('h2', attrs = {'class':'article-prefix'}).text
        print(volanta_nota)
        print('\n')
        
        cuerpo_nota = s_nota.find('div', attrs = {'class':'article-text'}).find_all('p')
        
        textos = '' 
        for i in cuerpo_nota:
            textos += i.text
        
        print(textos)
        print('\n')
        
except Exception as e:
    print('Error \n')
    print(e)
    print('\n')

Como respuesta da:

Guzmán sobre la misión del FMI: “Avanzamos en lineamientos del programa que reemplazará al fallido”

2020-11-21

“La premisa es crecer para apuntalar la estabilización económica”, remaracó el funcionario nacional. La misión para obtener información sobre la marcha de la economía concluyó este viernes.

El ministro de Economía dio más detalles sobre las discusiones que mantuvo con el Fondo

El ministro de Economía, Martín Guzmán, aseguró este sábado que el Gobierno avanzó con la misión del Fondo Monetario Internacional (FMI) en “los lineamientos del programa que reemplazará el fallido programa anterior”, ejecutado entre la gestión de Mauricio Macri y la francesa Christine Lagarde.“La premisa es crecer para apuntalar la estabilización económica”, remaracó el funcionario nacional, al tiempo que señaló que “con la misión del FMI avanzamos en los lineamientos del programa que reemplazará el fallido programa anterior”.“Deberá estar trazado por nosotros, desde la acción colectiva y el entendimiento de lo que necesitamos”, agregó el titular de la cartera económica en su cuenta de Twitter.Este viernes, el ministro participó de una reunión virtual con los ministros de Finanzas de los países del Grupo de los 20 (G20), donde solicitó apoyo a las renegociaciones que la Argentina mantiene con el FMI por considerar necesario llegar a un acuerdo con ese organismo para “resolver” la “crisis macro y de deuda” y establecer un programa sostenible.“El siguiente paso para resolver nuestra crisis macro y de deuda es el programa con el FMI, que reemplazará al acuerdo stand by que Argentina y el organismo firmaron en 2018. Ahora también los necesitaremos, y les pido su apoyo en este proceso”, había resaltado.En cuanto al nuevo programa que se negocia con el organismo multilateral, explicó que “las políticas macroeconómicas tendrán que dar cuenta de la realidad que atraviesa el país. Tenemos que definir de manera muy cuidadosa las formas con las que decidimos resolver todos los desequilibrios, porque es urgente abordar los desequilibrios sociales”.En tanto, la misión para obtener información sobre la marcha de la economía concluyó este viernes y se estima que el nuevo acuerdo se firmará recién en 2021, para reprogramar pagos por el préstamo de 44.000 millones de dólares.Tras la finalización de la visita, el FMI aseguró que hay “avances” ante la intención de la Argentina de solicitar un nuevo programa de apoyo, pero advirtió que “se requerirá un conjunto de políticas cuidadosamente calibradas para fomentar la estabilidad”.En ese escenario, el director ante el FMI por la Argentina y el Cono Sur, Sergio Chodos, subrayó que “es importante entender que esto es un proceso” y estimó que no se llegará a un acuerdo con el organismo multilateral durante este año.
“No lo veo y tampoco lo veo como una necesidad ni de ellos ni nosotros. El trabajo se tiene que hacer bien, no rápido. Y para hacerlo bien, se tiene que tener la cantidad de elementos técnicos y discusiones”, planteó en declaraciones radiales.

Al 01/06/2020 cambio un poquito la estructura y el titulo ya no se encuentra en un div sino en un h1, asi que hay que remplazara el

titulo = s_nota.find('div', attrs={'class': 'article-title'})

por

titulo = s_nota.find('h1', attrs={'class': 'article-title'})
try:
    nota = requests.get(url_noticia)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        # Extraemos el título
        titulo = s_nota.find('h1', attrs={'class':'article-title'})
        print(titulo.text)
        #Extraer la fecha del articulo
        fecha = s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(fecha)
        #Extraer nota previa al titulo => "volanta"
        volanta = s_nota.find('h2', attrs={'class':'article-prefix'})
        print(volanta)
        #Extraer resumen o copete
        resumen = s_nota.find('div' , attrs={'class':'article-summary'})
        print(resumen)
        #Extraer texto
        texto = s_nota.find('div',attrs={'class':'article-text'})
        print(texto)
        
except Exception as e:
    print('Error:')
    print(e)
    print('\n')```

😃

Excellent!

Mi codigo del reto:

# Extraer la volanta
        volanta = s_nota.find('div', attrs={'class':'article-titles'}).find('h2', attrs={'class':'article-prefix'})
        print('Volanta:', volanta.text)
        
        # Extraer autor
        autor = s_nota.find('div', attrs={'class':'article-author'}).a
        print('Autor:', autor.text)
        
        # Extraer el cuerpo
        cuerpo = s_nota.find('div', attrs={'class':'article-text'})
        print('Cuerpo:', cuerpo.text)

Resultados:

En este caso la noticia no tenia el copete.

Mi solución

for index, (title, link) in enumerate(section_link.items()):
    try:
        note = requests.get(link)
        soup_note = BeautifulSoup(note.text)
        soup_note_title = soup_note.find('h1', attrs={'class': 'article-title'})
        # Extract date fo the article
        soup_note_date = soup_note.find('span', attrs={'pubdate': 'pubdate'}).get('datetime')
        if not soup_note_date:
            soup_note_date = ''
        # Extract author of the new
        soup_note_author = soup_note.find('div', attrs={'class': 'article-author'}).a
        if not soup_note_author:
            soup_note_author = ''
        else:
            soup_note_author = soup_note_author.text
        # Extract volanta of the new
        soup_note_volanta = soup_note.find('h2', attrs={'class': 'article-prefix'})
        if not soup_note_author:
            soup_note_volanta = ''
        else:
            soup_note_volanta = soup_note_volanta.text
        # Extract copete of the new
        soup_note_copete = soup_note.find('div', attrs={'class': 'article-summary'})
        if not soup_note_copete:
            soup_note_copete = ''
        else:
            soup_note_copete = soup_note_copete.text
        # Extract body of the new
        soup_note_body = soup_note.find('div', attrs={'class': 'article-text'}).find_all('p')
        text_body = ''
        for paragraph in soup_note_body:
            text_body += paragraph.text + '\n'
        print(f'{index+1}: {soup_note_title.text} - {soup_note_date} - {soup_note_author} - {soup_note_volanta} - {soup_note_copete} - {text_body}\n\n')
    except Exception as e:
        print(f'\n{e}\n')

Reto Completado:

try:
  nota = requests.get(url_nota)
  if nota.status_code == 200:
    s_nota = BeautifulSoup(nota.text, 'lxml')
    # Extraemos el titulo
    titulo = s_nota.find('h1', attrs = {'class':'article-title'})
    print(titulo.text)
    #Extraemos la fecha
    fecha = s_nota.find('span', attrs = {'pubdate':'pubdate'}).get('datetime')
    print(fecha)
    # Extraemos la Volanta
    volanta = s_nota.find('h2', attrs = {'class':'article-prefix'})
    if volanta:
      print(volanta.text)
    # Extraemos el autor
    copete = s_nota.find('div', attrs = {'class':'article-summary'})
    if copete:
      print(copete.text)
    # Extraemos el autor
    autor = s_nota.find('div', attrs= {'class':'article-author'}).a
    if autor:
      print(autor.text)
    # Extraemos el cuerpo
    cuerpo = s_nota.find('div', attrs= {'class':'article-text'}).find_all('p')
    parrafos = [parragraph.text for parragraph in cuerpo]
    for parrafo in parrafos:
      print(parrafo)
except Exception as e:
  print('Error: ')
  print(e)
  print('\n')

Aca mi solucion al reto 🤓

def get_article_content(url):
    try:
        note = requests.get(url)
        if note.status_code == 200:
            s_note = BeautifulSoup(note.text, 'lxml')           
            title = s_note.find('div', attrs={'class':'article-title'})
            if title:
                print(title.text)          
            date = s_note.find('span', attrs = {'pubdate':'pubdate'}).get('datetime')
            if date:
                print(date)
            v_ = s_note.find('div', attrs = {'class':'article-prefix'})
            if v_:
                print(v_.text)
            sum_ = s_note.find('div', attrs = {'class': 'article-summary'})
            if sum_:
                print(sum_.text)
            art_t_p = s_note.find('div',attrs = {'class':'article-text'})
            if art_t_p:
                for i in art_t_p.find_all('p'):
                    print(i.text)
            author = s_note.find('div', attrs={'class': 'article-author'})
            if author:
                print(author.span.a.get_text())
    except Exception as e:
        print('Error:')
        print(e)
        print('\n')

En general los cursos de Scrap de la ruta estan muy buenos.

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
            s_nota = BeautifulSoup(nota.text, 'lxml') #se "se parcea"
            #estraemos titulo
            titulo = s_nota.find('div', attrs={'class': 'article-title'})
            print(titulo.text)
            
            autor = s_nota.find('div', attrs={'class':'article-author'}).a
            print(f'Autor: {autor.text}', '\n')
            
            fecha = s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
            print(fecha,'\n')
            
            try:
                bajada = s_nota.find('div', attrs={'class':'article-summary'})
                print(bajada.text, '\n')
            
            except:
                print('\n')
            
            texto = s_nota.find('div', attrs={'class':'article-text'}).find_all('p')
            for text in texto:
                print(text.text, '\n')
            

except Exception as e:
    print('Error:')
    print(e)
    print('\n')

Este es mi código:

Solución al reto, Código:

Output:

Mi solución:

try:
    news = requests.get(news_url)
    if news.status_code == 200:
        s_news = BeautifulSoup(news.text, 'html.parser')
        title = s_news.find('h1', attrs={'class':'article-title'})
        print(title.text)
        date = s_news.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        prefix = s_news.find('h2', attrs={'class':'article-prefix'})
        summary = s_news.find('div', attrs={'class':'article-summary'})
        body = s_news.find('div', attrs={'class': 'article-text'})
        author = s_news.find('div', attrs={'class':'article-author'})
        print(date)
        print(prefix.text)
        print(summary.text)
        print(body.text)
        print('\n\n{}'.format(author.text))
except Exception as a:
    print('Error')```

Reto 01/10/2020

try:
    nota=requests.get(url_nota)
    if nota.status_code == 200:
        s_nota= BeautifulSoup(nota.text, 'lxml')
        #Extraemos el titulo
        titulo = s_nota.find('h1',attrs={'class':'article-title'})
        print(titulo.text) #text sirve para imprimir solo text que se imprime en la pagina
        fecha = s_nota.find('span',attrs={'class':'p12-separator--right--gray'})
        print(fecha.text)
        volanta = s_nota.find('div',attrs={'class':'article-summary'})
        print(volanta.text)
        volanta = s_nota.find('h2',attrs={'class':'article-prefix'})
        print(copete.text)
        cuerpo = s_nota.find('div',attrs={'class','article-text'})
        print(cuerpo.text)
        autor = s_nota.find('div',attrs={'class','article-author'})
        print(autor.text)
except Exception as e:
    print('Error:')
    print(e)
    print("\n")

output

Coronavirus: la Universidad de Oxford probará un fármaco que se usa para artritis  
01 de octubre de 2020
Adalimumab es una droga que está en el mercado desde hace casi 20 años y ayuda a combatir procesos inflamatorios en otras enfermedades. El punto de vista de Daniel Alonso, investigador principal del Conicet, sobre su posible éxito para covid.
De los ensayos participarán 750 adultos mayores de Reino Unido  
La Universidad de Oxford comenzará a probar en pacientes con covid la eficacia del adalimumab, un anticuerpo monoclonal que gracias a sus propiedades antiinflamatorias a menudo se usa para tratar la artritis. Del ensayo, liderado por la Unidad de Investigación de Ensayos ................ (Le corto es largo)
Por Pablo Esteban```

Les dejo mi codigo:

import requests
from bs4 import BeautifulSoup

try:
    urls = 'https://www.pagina12.com.ar/secciones/sociedad'
    s12 = requests.get(urls)
    if s12.status_code == 200:
        soup  = BeautifulSoup(s12.text, 'lxml')
        lista = obtener_notas(soup)
        print(lista)
    else:
        print(f'La url entrego un status code de {s12.status_code}')
except Exception as e:
    print('Error en la request')
    print(e)

url_nota = lista[2]
print(url_nota)

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        
        # La volanta
        volanta_nota = s_nota.find('div', attrs = {'class':'article-titles'}).h2
        print(volanta_nota.text)
        # Extraemos el titulo
        titulo_nota = s_nota.find('div', attrs = {'class':'article-titles'}).h1
        print(titulo_nota.text)
        # Extraemos la fecha
        fecha_nota = s_nota.find('div', attrs = {'class':'time'}).span.get('datetime')
        print(fecha_nota)
        # Copete
        try:
            copete_nota = s_nota.find('div', attrs = {'class':'article-summary'})
            print(copete_nota.text)
            print('\n')
        except:
            print('La noticia no tiene copete!!!!!!!!!!!!!')
        # El cuerpo
        cuerpo_nota = s_nota.find('div', attrs = {'class':'article-text'}).find_all('p')
        for paragraph in cuerpo_nota:
                print(paragraph.text)
        # El autor, no se ve en las noticias

    else:
        print(f'La url entrego un status code de {nota.status_code}')
        raise Exception
except Exception as e:
    print('Error:')
    print(e)
    print('\n')
try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        
        # Extraemos el título
        titulo = s_nota.find('div', attrs={'class':'article-title'})
        print(titulo.text)
        
        # Extraemos la fecha del artículo
        date = s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(date)
        print()
        
        # Obtenemos la volanta
        volanta = s_nota.find('div', attrs={'class':'article-prefix'})
        print(volanta.text)
        print()
        
        # Obtenemos la bajada
        bajada = s_nota.find('div', attrs={'class':'article-summary'})
        print(bajada.text)
        print()
        
        # Cuerpo
        cuerpo = s_nota.find('div', attrs={'class':'article-text'})
        print(cuerpo.text)
        print()
        
except Exception as e:
    print('Error: \n',e, '\n')
try:
    nota = requests.get(x[1])
    if nota.status_code==200:
        s_nota=BeautifulSoup(nota.text,'lxml')
        #extraemos el titulo
        titulo = s_nota.find('h1', attrs={'class':'article-title'})
        print(titulo.text)
        print('\n')
        #extraer la fecha
        fecha= s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(fecha)
        #extraer volante
        volante = s_nota.find('h2',attrs={'class':'article-prefix'})
        print(volante.text)
        print('\n')
        #Extraer copete
        try:
            copete = s_nota.find('div', attrs={'class':'article-summary'})
            print(copete.text)
        except:
            pass
        #cuerpo
        cuerpo=s_nota.find('div',attrs={'class':'article-text'})
        print('\n')
        print(cuerpo.text)
    
except Exception as e:
    print('error')
    print(e)
    print('\n')```

Bien!

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
      s_nota = BeautifulSoup(nota.text, 'lxml')
      # Extraer el titulo
      titulo = s_nota.find('div', attrs={'class': 'article-title'})
      print(titulo.text)  
      # Extraer fecha
      fecha = s_nota.find('span', attrs={'pubdate': 'pubdate'}).get('datetime')
      print(fecha)
      # Extraer volanta
      volanta = s_nota.find('h2', attrs={'class': 'article-prefix'})
      print(volanta.text)
      # Extraer titular
      titular = s_nota.find('h1', attrs={'class': 'article-title'})
      print(titular.text)
      # Extraer resumen
      summary = s_nota.find('div', attrs={'class': 'article-summary'})
      print(summary.text)
      # Extraer texto principal
      main = s_nota.find('div', attrs={'class': 'article-text'})
      print(main.text)


except Exception as error:
    print('error')
    print(error)
    print('\n')

Aquí mi solución:

def get_text(post_url):
    """This function extracts the text type
    content of the input URL"""

    try:
        post = r.get(post_url)

        if post.status_code == 200:
            post_soup = BeautifulSoup(post.text, 'lxml')
            #Extract the title
            title = post_soup.find('div', attrs={'class', 'article-titles'}).find('h1', attrs={'class':'article-title'})
            #Date extraction
            date = post_soup.find('div', attrs={'class':'time'}).span.get('datetime')
            #Volanta Extraction
            try:
                volanta = post_soup.find('div', attrs={'class', 'article-titles'}).find('h2', attrs={'class':'article-prefix'})
            except:
                print('Volanta: None')
            #Body
            body = post_soup.find('div', attrs={'class':'article-text'})
            #Author
            try:
                author = post_soup.find('div', attrs={'class':'article-author'})
            except:
                print('Author: Anonymous')
            #Print results
            print(date, '\n')
            print(author.text, '\n')
            print(volanta.text)
            print(title.text, '\n')
            print('\n', body.text)
    except Exception as e:
        print(f'\nError: {e}\n')```

Este es mi codigo del reto

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        soup_nota = BeautifulSoup(nota.text,'lxml')
        #Extraer el titulo
        titulo = soup_nota.find('h1', attrs = {'class':'article-title'})
        print('Titulo:',titulo.text)
        #Extraer la fecha
        fecha = soup_nota.find('span', attrs = {'pubdate':'pubdate'}).get('datetime')
        print('Fecha:',fecha)
        
        volanta = soup_nota.find('h2', attrs = {'class':'article-prefix'})
        print('Volanta:',volanta.text) 
        
        copete = soup_nota.find('div', attrs = {'class':'article-summary'})
        print('Copete:',copete.text) 

        text_imagen = soup_nota.find('div', attrs = {'class':'article-main-media-image'})
        print('Epigrafe:',text_imagen.text) 

        cuerpo = soup_nota.find_all('p')
        print('Cuerpo:')
        for text in cuerpo:
            print(text.text)

except Exception as e:
    print('Error')
    print(e,'\n')

Done

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        
        # Extraer copete
        copete = s_nota.find('h2', attrs = {'class':'article-prefix'})
        print('Copete: ' + copete.text + '\n')
        # Extraer título
        titulo = s_nota.find('h1', attrs = {'class':'article-title'})
        print('Título: ' + titulo.text + '\n')
        # Extraer fecha
        fecha = s_nota.find('span', attrs = {'pubdate':'pubdate'}).get('datetime')
        print('Fecha: ' + fecha + '\n')
        # Extraer volanta
        volanta = s_nota.find('div', attrs = {'class':'article-summary'})
        print('Volanta: ' + '\n' + volanta.text)
except Exception as error:
    print('Error: ')
    print(error)
    print('\n')
    

Hola. Comparto mi código en donde el usuario puede escoger de que categoría obtener los links, título, volanta, copete y autor.

PD:

  1. Me base en el Extract por HTML como se hacia en el curso de Ingeniería de datos con Python de David Aroesti
  2. Para la sección de cultura, la obtención de los links era de forma diferente respecto a las demás
import requests
import bs4 
from requests.exceptions import HTTPError
import re

def get_section(url):

    try:
        response = requests.get(url)
    except HTTPError:
        print('HTTP Error, web not available')

    response.encoding = 'utf-8'
    soup = bs4.BeautifulSoup(response.text, 'html.parser')

    sections = list(set(soup.select('ul.horizontal-list a')))
    print('Choose a section to scraper')
    for i, section in enumerate(sections):
        print(f'Section: {i}. {section.text}')
    
    user = int(input('Option: '))

    try:
        option = sections[user]['href']
    except IndexError:
        print('Invalid Option')
    
    link_generator(option)

def link_generator(option):
    try:
        response = requests.get(option)
    except HTTPError:
        print('HTTP Error, web not available')

    response.encoding = 'utf-8'
    soup = bs4.BeautifulSoup(response.text, 'html.parser')

    if re.search('cultura', option):
        news = set(soup.select('.article-box__container a'))
    else:
        news = set(soup.select('.title-list a'))

    article_links = []
    for item in news:
        #print(f"Link: {item['href']}")
        article_links.append(item['href'])
    
    content(article_links)

def content(articles):
    for link in range(len(articles)):
        response = requests.get(articles[link])
        response.encoding = 'utf-8'
        soup = bs4.BeautifulSoup(response.text, 'html.parser')

        print(f'************* \n Link: {articles[link]} \n')

        try:
            title = soup.select('.article-titles h1')
            print(f'Title:\n{title[0].text} \n\n')
        except:
            print(f'No Title \n')

        try:
            volanta = soup.select('.article-prefix')
            print(f'Volanta:\n{volanta[0].text} \n\n')
        except:
            print(f'No volanta \n')

        try:
            summary = soup.select('.article-summary')
            print(f'Summary:\n{summary[0].text} \n\n')
        except:
            print(f'No summary \n')

        try:
            author = soup.select('.credits a')
            print(f'Author:\n{author[0].text} \n\n')
        except:
            print(f'No author \n')
    
if __name__ == '__main__':
    print('-----Welcome to your link generator-----')
    url = 'https://www.pagina12.com.ar'
    get_section(url)
    ```

Aora Octubre 2021:
Los ‘href’ no vienen dados completamente, en el texto de la funcion obtener_notas, sustitui la linea lista_notas.append por la siguiente linea de codigo:

lista_notas.append('https://www.pagina12.com.ar'+(article.a.get('href')))

Asi nos da la url completa y podemos seguir con el ejercicio quepropociono el profe

OCTUBRE 2021.
aqui esta la solucion del reto

try:
    nota = rq.get(url_nota)
    if nota.status_code == 200:
        s_nota = bs(nota.text, 'lxml')
        #extraemos el titulo
        titulo = s_nota.find('div',attrs={'class':'col 2-col'}).find('h1')
        print(titulo.text)
        #extraemos la fecha
        fecha = s_nota.find('div', attrs={'class':'date modification-date'}).find('time')
        print(fecha.text)
        autor = s_nota.find('div', attrs={'class':'author-inner'})
        print(autor.text)
        volanta = s_nota.find('div', attrs={'class':'col 2-col'}).find('h4')
        print(volanta.text)
        cuerpo = s_nota.find('div', attrs={'class':'article-main-content article-text'}).find_all('p')
        print(cuerpo)
    
except Exception as e:
    print('error:')
    print(e)
    print('\n')

Hice este código que crea un archivo con la fecha actual, en el cual se encuentran otros archivos divididos por las secciones de noticias y adentro de cada uno se encuentran todas las noticias de esa seccion en la fecha actual, cada una en un .txt.

Igual creo que falta pulirlo porque hay archivos .txt que terminan en blanco, creo que se debe a que la dirección html podría ser distinto en algunas noticias.

import requests
from bs4 import BeautifulSoup
import os
import datetime

url = 'https://www.pagina12.com.ar/'


def parse_home(date,title_and_link_sections):
    try:
        for section in title_and_link_sections:
            parent_dir = date
            path = os.path.join(parent_dir, section[0])
            os.mkdir(path)
            news_links(path,section[1])

    except Exception as e:
        print(f"Error: {e}\n")


def news_links(path,url_section):
    try:
        new_page = requests.get(url_section)
        
        if new_page.status_code == 200:
            html_page = BeautifulSoup(new_page.text,'lxml')

            articles = html_page.find('section',attrs={'class':'list-content'}).find_all('article')
            
            article_links = [article.find('a').get('href') for article in articles]
            
            for link in article_links:
                scraper_article(path,url + link)



    except Exception as e:
        print(f"Error:{e}\n")



def scraper_article(path,article_link):
    try:
        nota = requests.get(article_link)
        if nota.status_code == 200:
            s_nota = BeautifulSoup(nota.text,'lxml')
            article_section = s_nota.find('article',attrs={'class':'article-full section'})
            volanta = article_section.find('div',attrs={'class':'section-2-col article-header'}).find('h4').text
            titulo = article_section.find('div',attrs={'class':'section-2-col article-header'}).find('h1').text
            cuerpo_p = article_section.find('div',attrs={'class':'section-2-col article-main-content'}).find_all('p')
            
            with open(f'{path}\{titulo}.txt','w',encoding='utf-8') as f:
                f.write(volanta)
                f.write("\n\n")
                f.write(titulo)
                f.write("\n\n")
                for parrafo in cuerpo_p:
                    f.write(parrafo.text)
                    f.write("\n")

    except Exception as e:
        print(f"Error: {e}\n")



def run():
    p12 = requests.get(url)

    html_page = BeautifulSoup(p12.text,'lxml')
    sections = html_page.find('ul',attrs={'class':'horizontal-list main-sections hide-on-dropdown'}).find_all('li')
    title_and_link_sections = [[section.a.text,section.a.get('href')] for section in sections]
    today = datetime.date.today().strftime('%d-%m-%Y')
    if not os.path.isdir(today):
        os.mkdir(today)
    
    parse_home(today,title_and_link_sections)


if __name__ == '__main__':
    run()

Comparto mi código al día 27 de noviembre del 2021:

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        # Extraemos el titulo
        titulo = s_nota.find('div', attrs={'class':'col 2-col'})
        print(titulo.h1.text)
        # Extraer la fecha
        fecha = s_nota.find('time').get('datetime')
        print(fecha)
        # Extraer el volanta:
        volanta = s_nota.find('div', attrs={'class':'col 2-col'})
        print(titulo.h4.text)
        # Extraer el copete:
        copete = s_nota.find('div', attrs={'class':'article-main-content article-text'})
        print(copete.h2.text)
        # Extraer el cuerpo:
        autor = s_nota.find('div', attrs={'class':'article-main-content article-text'})
        print(autor.text)
        
except Exception as e:
    print('Error:')
    print(e)
    print('\n')

¡Reto completado! 😉

def extract_info(url_nota):
    """Función que extrae la información de una nota a partir de su url"""
    try:
        nota = requests.get(url_nota)
        if nota.status_code == 200:
            s_nota = BeautifulSoup(nota.text, 'lxml')

            # Extraemos el título
            title = s_nota.find('div', attrs={
                'class': 'article-title'
            }).get_text()
            print('Título:', title, '\n')

            # Extraemos la fecha
            date = s_nota.find('span', attrs={
                'pubdate': 'pubdate'
            }).get('datetime')
            print('Fecha:', date, '\n')

            # Extraemos el copete
            try:
                summary = s_nota.find('div', attrs={
                    'class': 'article-summary'
                }).get_text()
                print('Copete:', summary, '\n')
            except:
                print('Copete: vacío', '\n')

            # Extraemos la volanta
            try:
                prefix = s_nota.find('div', attrs={
                    'class': 'article-prefix'
                }).get_text()
                print('Volanta:', prefix, '\n')
            except:
                print('Volanta: vacío')

            # Extraemos el cuerpo
            body_paragraphs = s_nota.find('div', attrs={
                'class': 'article-body'
            }).find('div', attrs={
                'class': 'article-text'
            }).find_all('p')

            body = "\n\n".join([p.text for p in body_paragraphs])
            print('Cuerpo:', body, '\n')

            #Extraemos el autor
            try:
                author = s_nota.find('div', attrs={
                    'class': 'article-author'
                }).span.a.get_text()
                print('Autor:', author)
            except:
                print('Autor: anónimo')

    except Exception as e:
        print('error:', e, '\n')

# Ejemplo de uso

url_nota = 'https://www.pagina12.com.ar/233660-clonacion-bebes-de-diseno-etica-y-tecnologia'
extract_info(url_nota)

#Out
"""
Título: Clonación, bebés de diseño, ética y tecnología 

Fecha: 2019-11-29 

Copete: vacío 

Volanta: Charlas del psicoanalista François Ansermet  

Cuerpo: La Universidad Nacional de San Martín invita a las actividades públicas que el psicoanalista François Ansermet realizará en Buenos Aires el 2 y el 4 de diciembre en torno a las técnicas de procreación asistida, su impacto subjetivo y sus implicancias éticas. 

El lunes 2, desde las 12, se realizará la Jornada "La fabricación de los hijos". En ese marco, a las 18.30 habrá un diálogo público entre Ansermet y Adrián Mutto: "De la clonación a los bebés de diseño. Ética y tecnología de la procreación". En el Aula Tanque del Campus Miguelete, en 25 de Mayo y Francia (San Martín). Entrada gratis, hasta colmar la sala. Inscripción: [email protected]

El miércoles 4, a las 18, se llevará a cabo la conferencia "El origen por venir. Las sorpresas de la procreación en la era de las biotecnologías", en el Centro Cultural de la Ciencia, en Godoy Cruz 2270 (CABA).  

Autor: anónimo
"""
try:
    nota = requests.get(url_nota)
    if (nota.status_code == 200):
        s_nota = BeautifulSoup(nota.text, 'lxml')
        article_titles = s_nota.find('div', attrs={'class': 'article-titles'})
        #GET TITULO
        if article_titles:
            if article_titles.h1:
                titulo = article_titles.h1.get_text()
                print("Titulo: ")
                print(titulo)
                print("\n")
        #GET FECHA
        pubdate = s_nota.find('span', attrs={'pubdate': 'pubdate'})
        if pubdate:
            fecha = pubdate.get('datetime')
            print("Fecha: ")
            print(fecha)
            print("\n")
        #GET VOLANTA
        if article_titles:
            if article_titles.h2:
                volanta = article_titles.h2.get_text()
                print("Volanta: ")
                print(volanta)
                print("\n")
        #GET COPETE
        if article_titles:
            if article_titles.find('div', attrs={'class': 'article-summary'}):
                copete = article_titles.find('div', attrs={'class': 'article-summary'}).get_text()
                print("Copete: ")
                print(copete)
                print("\n")
        #GET CUERPO
        article_text = s_nota.find('div', attrs={'class': 'article-text'})
        if article_text:            
            cuerpo = article_text.get_text()
            print("Cuerpo: ")
            print(cuerpo)
            print("\n")
        #GET AUTOR
        article_author = s_nota.find('div', attrs={'class': 'article-author'})
        if article_author:
            if article_author.find('a'):                
                autor = article_author.find('a').get_text()
                print("Autor: ")
                print(autor)
                print("\n")
except Exception as e:
    print("Error")
    print(e)
    print("\n")

Reto:

import requests
from bs4 import BeautifulSoup
from pprint import pprint as pp


def make_safe_request(url):
    try:
        resp = requests.get(url)
        if resp.status_code == 200:
            return BeautifulSoup(resp.text, 'lxml')
        else: return None
    except Exception as e:
        print(e)
        return None


def get_content_from_article(url):
    data = {'title': '', 'subtitle': '', 'author': '', 'url': '', 'image': '', 'date': '', 'content': ''}
    soup = make_safe_request(url)
    if soup is None: return data

    data['url'] = url
    data['title'] = soup.select_one('.article-title').get_text()
    data['subtitle'] = soup.select_one('.article-prefix').get_text()
    data['author'] = soup.select_one('.article-author .no-link').get_text()
    data['image'] = soup.select('.article-main-media-image img')[-1].get('data-src', '')
    data['date'] = soup.select_one('.time span').get('datetime', '')
    article_text = soup.select('.article-text p')
    content = [p.get_text() for p in article_text]
    data['content'] = ' '.join(content)
    pp(data)
    return data

try:
nota = requests.get(url_nota)
if nota.status_code == 200:
s_nota = BeautifulSoup(nota.text, ‘lxml’)
#Extraemos el titulo
titulo = s_nota.find(‘h1’, attrs={‘class’:‘article-title’})
print(titulo.text)
#Extraer la fecha
fecha = s_nota.find(‘span’, attrs={‘pubdate’ : ‘pubdate’}).get(‘datetime’)
print(fecha)
#Volanta
volanta = s_nota.find(‘h2’,attrs = {‘class’ : ‘article-prefix’})
print(volanta.text)
#Copete o bajada(resumen)
copete = s_nota.find(‘div’, attrs={ ‘class’ : ‘article-summary’})
print(copete.text)
#cuerpo
cuerpo = s_nota.find(‘div’, attrs={ ‘class’ : ‘article-text’})
print(cuerpo.text)

except Exception as e:
print(‘Error: ‘)
print(e)
print(’\n’)

try:
    nota =  requests.get(url_nota)
    if nota.status_code == 200:
        sopa_nota = BeautifulSoup(nota.text, 'html.parser')
        #Extraer el titulo
        titulo = sopa_nota.find('h1', attrs = {'class': 'article-title'})
        print(titulo.text)   # y Obtenemos el titulo
        
        print('')
        #Extraer la fecha
        fecha = sopa_nota.find('span', attrs = {'pubdate': 'pubdate'}).get('datetime')
        print(fecha)
        print('')
         
        #Extraer Volanta
        volanta = sopa_nota.find('h2', attrs ={'class': 'article-prefix'})
        print(volanta.text)
        print('')
        
        #Copete
        copete = sopa_nota.find('div', attrs ={'class': 'article-summary'}).text
        print(copete)
        print('')
         
        #Cuerpo
        cuerpo = sopa_nota.find('div', attrs = {'class': 'article-body diario'}).find_all('p')
        c = ''
        for parrafo in cuerpo:
            c = c + parrafo.text
        print(c)
       
        print('')
        #Author
        autor = sopa_nota.find('div', attrs = {'class': 'article-author'}).a.text
        print('Por {}'.format(autor))
            
except Exception as e:
    print('Error')
    print(e)
    print('\n')

Les dejo mi codigo

import requests
import bs4

try:
    nota = requests.get('https://www.pagina12.com.ar/265049-el-aporte-industrial-en-la-pandemia')
    if nota.status_code == 200:
        s_nota = bs4.BeautifulSoup(nota.text, 'html.parser')
        titulo = s_nota.find('h1', attrs={'class':'article-title'})
        print(f'Titulo: {titulo.text} \n')
        date = s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(f'Fecha: {date} \n')
        volanta = s_nota.find('h2', attrs={'class':'article-prefix'})
        print(f'Volanta: {volanta.text} \n')
        copete = s_nota.find('div', attrs={'class':'article-summary'})
        print(f'Copete: {copete.text} \n')
        autor = s_nota.find('div', attrs={'class':'article-author'})
        print(f'Autor(es): {autor.text} \n')
        cuerpo = s_nota.find('div', attrs={'class':'article-text'})
        for parrafo in cuerpo.find_all('p'):
            print('\n' + parrafo.text)
            
except Exception as e:
    print('Error:')
    print(e)
    print('\n')```

Comparto mi código. Cambie la variable “nota” por “post”

try:
    post = requests.get(url_post)
    if post.status_code == 200:
        soup_post = BeautifulSoup(post.text, 'lxml')
        #Extraemos el título
        titulo = soup_post.find('h1', attrs={'class':'article-title'})
        print(titulo.text)
        #Extraemos la fecha
        fecha = soup_post.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(fecha)
        #Extraemos la volanta
        volanta = soup_post.find('h2', attrs={'class':'article-prefix'}).text
        print(volanta)
        #Extraemos el resumen (copete o bajada)
        resumen = soup_post.find('div', attrs={'class':'article-summary'}).text
        print(resumen)
        #Extraemos el cuerpo
        cuerpo = soup_post.find('div', attrs={'class':'article-text'}).text
        print(cuerpo)
except Exception as e:
    print('Error:')
    print(e)
    print('\n')

Alguien sabe por qué sale este error?

try:
    nota = requests.get(url_nota)
    if(nota.status_code == 200):
        s_nota = BeautifulSoup(nota.text, 'lxml')
        #Extraemos el titulo
        titulo = s_nota.find('h1', attrs={'class': 'article-title'})
        print("Title: " + titulo.text)
        #Extraer la fecha del articulo
        fecha = s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print('Date: '+ fecha)
        #Copete
        head_line = s_nota.find('div', attrs={'class':'article-summary'})
        print('Head Line: ' + head_line.text)
        #Volanta
        volanta = s_nota.find('h2', attrs={'class':'article-prefix'})
        print('Volanta: ' + volanta.text)
        #Body
        article = s_nota.find('div', attrs={'class':'article-text'})
        print('Article: ' + article.p.text)
        #Author
        print(article.find('i').text)
except Exception as e:
    print('error')
    print(e)
    print('\n')

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        #Extraemos la volanta
        volanta = s_nota.find('div',attrs={'class':'article-titles'}).find('h2')
        print("Volanta: \n",volanta.text,'\n')
        #Extraemos el titulo
        titulo = s_nota.find('div',attrs={'class':'article-titles'}).find('h1')
        print("Titulo: \n",titulo.text,'\n')
        #Extraemos la fecha
        fecha = s_nota.find('span', attrs = {'pubdate': 'pubdate'}).get('datetime')
        print("Fecha: \n",fecha,'\n')
        #Extraemos el copete
        copete = s_nota.find('div',attrs={'class':'article-summary'})
        print("Copete: \n",copete.text,'\n\n')        
        #Extraemos el cuerpo
        body = s_nota.find('div',attrs={'class':'article-text'})
        print("Cuerpo: \n",body.text,'\n\n')
        #Extraemos el autor
        autor = s_nota.find('div', attrs={'class':'article-author'})
        print('Autor:  ',autor.text)
        
except Exception as e:
    print('Error \n\n',e,'\n')

Aquí está mi código:

for link in final_links:
    try:
        nota = requests.get(link)
        if nota.status_code == 200:
            s_nota = BeautifulSoup(nota.text, 'html.parser')
            # Extraer el título
            title = s_nota.find('div', {'class' : 'article-title'})
            title = title.text
            # La fecha
            date = s_nota.find('span', {'pubdate' : 'pubdate'}).get('datetime')

            summary = s_nota.find('div', {'class' : 'article-summary'}).text

            author = s_nota.find('div', {'class' : 'article-author'}).a.text

            body = s_nota.find('div', {'class' : 'article-text'}).text
            print(title)
            print(date)
            print(author)
            print()
            print(summary)
            print()
            print(body[:50])
            print()
            print('* --- ' * 12)
            print()
            
            
    except Exception as e:
        print(e)

Reto :

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text,'lxml')
        #Extraemos el titulo
        volanta = s_nota.find('h2', attrs={'class':'article-prefix'})
        print(volanta.text)
        titulo = s_nota.find('h1', attrs={'class':'article-title'})
        print(titulo.text)
        fecha = s_nota.find('span', attrs={'pubdate':'pubdate'}).get(('datetime'))
        print(fecha)
        cuerpo = s_nota.find('div', attrs={'class':'article-text'})
        print(cuerpo.text)
        imagen = s_nota.find('div', attrs={'class':'article-main-media-image'})
        print(imagen.text)
except Exception as e:
    print('Error:')
    print(e)
    print('\n')```

Reto

try:
    nota=requests.get(url_nota)
    if nota.status_code==200:
        s_nota=BeautifulSoup(nota.text,'lxml')
        #Extraemos el titulo
        titulo=s_nota.find('div',attrs={'article-title'})
        print(titulo.text,'\n')
        #Extreaer la fecha
        fecha=s_nota.find('span',attrs={'pubdate':'pubdate'}).get('datetime')
        print(fecha,'\n')
        #Extraer Volanta
        volanta=s_nota.find('h2',attrs={'article-prefix'})
        print(volanta.text,'\n')
        #Copeta o bajada
        copete=s_nota.find('div',attrs={'article-summary'})
        print(copete.text,'\n')
        #Imagen 
        imagen=s_nota.find('div',attrs={'article-main-media-image'})
        print(imagen.text,'\n')
        #Epigrafe
        epigrafe=s_nota.find('span',attrs={'article-main-media-text-image-source'})
        print(epigrafe.text,'\n')
        #body
        body=s_nota.find('div',attrs={'article-text'})
        print(body.text,'\n')
except Exception as e:
    print('Error:')
    print(e)
    print('\n')```

😄

import requests
from bs4 import BeautifulSoup

def get_titleArticle(soup):
    title = soup.find('div', attrs = {'class', 'article-titles'}).find('h1', attrs={'class', 'article-title'})
    return title.text

def get_dateArticle(soup):
    dateArticle = soup.find('div', attrs = {'class', 'time'}).find('span').get('datetime')
    return dateArticle

def get_volantaArticle(soup):
    volantaArticle = soup.find('div', {'class', 'article-titles'}).find('h2', attrs={'class', 'article-prefix'})
    return volantaArticle.text


def get_boduArticle(soup):
    bodyArticle = soup.find('div', attrs={'class', 'article-text'}).find_all('p')
    textArticle = []
    for body in bodyArticle:
        if body.p:
            textArticle.append(body.text)
        elif body.b:
            textArticle.append(body.text)
    
    return textArticle

if __name__ == "__main__":
    url = 'https://www.pagina12.com.ar/265608-june-almeida-la-investigadora-que-descubrio-los-coronavirus'
    try:
        nota = requests.get(url)
        if nota.status_code == 200:
            soup = BeautifulSoup(nota.text, 'lxml')
            print('Title: ')
            print(get_titleArticle(soup))
            print('Date: ')
            print(get_dateArticle(soup))
            print('Volanta: ')
            print(get_volantaArticle(soup))

            print('Body: ')
            body = get_boduArticle(soup)
            for text in body:
                print(text)
    except Exception as e:
        print(f'Error: {e}')

Este es mi código. Aunque en algunos casos no hay autor o volanta, por lo que debería de haber un try para cada uno de esos ya que se para la ejecución si es que no hay.

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        # Extraemos el título
        titulo = s_nota.find('h1', attrs={'class':'article-title'}).text
        print(titulo)
        # Extraer la fecha
        fecha = s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(fecha)
        # Extraer el copete (resumen)
        copete = s_nota.find('div', attrs={'class':'article-summary'}).text
        print(copete)
        # Extraer la volanta (resumen arriba)
        volanta = s_nota.find('h2', attrs={'class':'article-prefix'}).text
        print(volanta)
        # Extraer el cuerpo
        cuerpo = s_nota.find('div', attrs={'class':'article-text'}).find_all('p')
        print(cuerpo)
        # Extraer el autor
        autor = s_nota.find('div', attrs={'class':'article-author'}).text
except Exception as e:
    print('Error:')
    print(e)
    print('\n')
try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        #Extraigo titulo
        titulo = s_nota.find('h1', attrs = {'class':'article-title'})
        print(titulo.text)
        #Extraer fecha
        fecha = s_nota.find('span', attrs = {'pubdate':'pubdate'}).get('datetime')
        print(fecha)
        #Extraer volanta
        volanta = s_nota.find('h2', attrs = {'class':'article-prefix'})
        print(volanta.text)
        #Extraer copete
        copete = s_nota.find('div', attrs = {'class':'article-summary'})
        print(copete.text)
        #Extraer autor
        autor = s_nota.find()
        
        

except Exception as e:
    print('Error: ')
    print(e)
    print('\n')
try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        #extraer la volanta 
        volanta = s_nota.find('h2', attrs={'class':'article-prefix'})
        print(volanta.text)
        #extraemos el titulo
        titulo = s_nota.find('div', attrs={'class':'article-title'})
        print(titulo.text)
        #extraer la fecha
        fecha = s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(fecha)
        #extraer el copete
        copete = s_nota.find('div', attrs={'class': 'article-summary'})
        print(copete.text)
        #extraer el cuerpo
        cuerpo = s_nota.find('div', attrs={'class': 'article-text'})
        print(cuerpo.text)
        #extraer el autor
        autor = s_nota.find('div', attrs={'class':'article-author'})
        print(autor.text)
        
except Exception as e:
    print('Error:')
    print(e)
    print('\n')```
try: 
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota =BeautifulSoup(nota.text, 'lxml')
        
        #Extraemos el titulo
        titulo = s_nota.find('h1', attrs = {'class':'article-title'})
        print(titulo.text)
        print('')
        
        #Extraer Fecha
        fecha = s_nota.find('span', attrs = {'pubdate':'pubdate'}).get('datetime')
        print(fecha)
        print('')
        
        #Extraer Volanta
        Volanta = s_nota.find('h2', attrs={'class':'article-prefix'}).get_text()
        print(Volanta)
        print('')
        
        #Extraer Cuerpo
        cuerpo = s_nota.find('div',attrs={'class':'article-text'})
        print(cuerpo.text)
        print('')
        
        #Extraer Autor
        autor = s_nota.find('span', attrs = {'class':'tag-name'}).get_text()
        print(autor)
        print('')
        
except Exception as e:
    print('Error:')
    print(e)
    print('\n')

Reto:

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        #extraer el titulo
        titulo = s_nota.find('div', attrs = {'class' : 'article-title'})
        print(titulo.text)
        #extraer la fecha
        fecha = s_nota.find('span', attrs = {'pubdate' : 'pubdate'}).get('datetime')
        print(fecha)
        #extraer volanta
        encabezado = s_nota.find('h2', attrs = {'class' : 'article-prefix'})
        print(encabezado.text)
        #extraer copete
        copete = s_nota.find('div', attrs = {'class' : 'article-summary'})
        print(copete.text)
        #extraer cuerpo
        cuerpo = s_nota.find('div', attrs = {'class' : 'article-text'})
        print(cuerpo.text)
        #extraer epigrafe
        epigrafe = s_nota.find('span', attrs = {'class' : 'article-main-media-text-image'})
        print(epigrafe.text)
        #autor
        autor = s_nota.find('span', attrs = {'class':'article-author'})
        print(autor)
        
except Exception as e:
    print('error: ')
    print(e)
    print('\n')```

Reto resuelto, les comento que en la parte del autor agrege una condicion ya que me toco un articulo sin autor y tuve que improvisar:

#Encapsularemos toda la request
try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        
        #Extraemos el titulo
        titulo = s_nota.find('h1', attrs={'class': 'article-title'})
        print(titulo.text)
        
        #Extraemos la fecha
        fecha = s_nota.find('span', attrs={'pubdate': 'pubdate'}).get('datetime')
        print(fecha)
        
        #Extraemos la Volanta
        volanta = s_nota.find('h2', attrs={'class': 'article-prefix'})
        print(volanta.text)
        
        #Extraemos el Copete
        copete = s_nota.find('div', attrs={'class': 'article-summary'})
        print(copete.text)
        
        #Extraemos el Cuerpo
        cuerpo = s_nota.find('div', attrs={'class': 'article-text'})
        print(cuerpo.text)
        
        #Extraemos el Autor
        autor = s_nota.find('div', attrs={'class': 'article-author'})
        if autor == None:
            print('Articulo Sin Autor')
        else:
            ('autor: ' + autor.text)
        
except Exception as e:
    print('Error: ')
    print(e)
    print('\n')```

Reto al 23/Sep/2020

try:
nota= requests.get(url_nota)
if nota.status_code== 200:
S_nota = BeautifulSoup(nota.text,‘lxml’)
print(nota.url)
titulo = S_nota.find(‘h1’, attrs={‘class’:‘article-title’}).get_text()
print(‘Tutulo de Nota:\n’,titulo)
fecNews = S_nota.find(‘span’, attrs={‘pubdate’:‘pubdate’}).get(‘datetime’)
print(‘Fecha de Nota:\n’,fecNews)
# copete
copete = S_nota.find(‘h2’, attrs={‘class’:‘article-prefix’}).get_text()
print(‘Copete de Nota:\n’,copete)
#Volanta
volanta = S_nota.find(‘div’, attrs={‘class’:‘article-summary’}).get_text()
print(‘Volanta de Nota:\n’,volanta)
except Exception as e:
print(‘Error: ‘, e,’\n’)

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        #convertimos en una sopa y le pasamos el texto de la nota
        s_nota = BeautifulSoup(nota.text, 'lxml')
        
        # extraemos el titulo
        titulo = s_nota.find('h1', attrs={'class': 'article-title'})
        print(titulo.text,'\n')
        
        # extraemos la fecha
        fecha = s_nota.find('span', attrs={'pubdate':'pubdate'}).get('datetime')
        print(fecha,'\n')
        
        # extraemos el volanta
        volanta = s_nota.find('h2', attrs={'class': 'article-prefix'})
        print(volanta.text,'\n')
        
        # extraemos el Autor
        autor = s_nota.find('div', attrs={'class': 'article-author'})
        if autor == None:
            print('Articulo Sin Autor', '\n')
        else:
            ('autor: ' + autor.text, '\n')
        
        # extraemos el cuerpo
        cuerpo = s_nota.find('div', attrs={'class': 'article-text'})
        print(cuerpo.text)
        
except Exception as e:
    print('Error:')
    print(e)
    print('\n')

Actualizado 16 de noviembre 2021
PD: no enconré el autor en la nota jeje

try:
    nota = requests.get(url_nota)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        # Extraemos el titulo
        titulo = s_nota.find('h1')
        print('Titulo:',titulo.text,'\n')
        # Extraemos la fecha
        fecha = s_nota.find('time').get('datetime')
        print('Fecha:',fecha,'\n')
        # Extraemos el copete
        copete = s_nota.find('h3').text
        print('Copete:',copete,'\n')
        # Extraemos la volanta
        volanta = s_nota.find('h4').text
        print('Volanta:',volanta,'\n')
        # Extraemos el cuerpo
        cuerpo = s_nota.find('div', attrs={'class':'article-text'}).text
        print('Cuerpo:',cuerpo,'\n')
        # Extraemos el autor
        
except Exception as e:
    print('Error:')
    print(e)
    print('\n')
       

7-dic-2021

try:
    nota  = requests.get(url_nota)
    if nota.status_code==200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        #Extraemos el titulo
        titulo = s_nota.find('div', attrs={'class': 'col 2-col'})
        print(titulo.h1.text)
        # Extraer la fecha
        fecha = s_nota.find('span', attrs={'class': 'p12-separator--right--gray'})
        print(fecha.text)
        # Extraer copete
        copete = s_nota.find('div', attrs={'class': 'col 2-col'})
        print(copete.h3.text)
        # Extraer  Volanta
        volanta = s_nota.find('div', attrs={'class': 'col 2-col'})
        print(volanta.h4.text)
        # autor
        autor = s_nota.find('div', attrs={'class': 'author-name'})
        print(autor.text)
        #Extraer cuerpo
        cuerpo = s_nota.find('div', attrs={'class': 'article-main-content article-text'})
        print(cuerpo.text)

except Exception as e:
    print('Error')
    print(e)
    print('\n')

Mi solucion

try:
    enlace = url + url_articulo
    articulo = requests.get(enlace)
    if articulo.status_code == 200:
        s_articulo = BeautifulSoup(articulo.text, 'lxml')
        # Extraer el titulo
        titulo = s_articulo.find('div', attrs={'class':'article-header'}).find('h1')
        print(titulo.text)
        # Extraer la fecha
        fecha = s_articulo.find('div', attrs={'class':'date modification-date'}).span.time.get('datetime')
        print(fecha)
        # Extraer la volanta
        volanta = s_articulo.find('div', attrs={'class':'article-header'}).find('h4')
        print(volanta.text)
        # Extrae el copete
        copete = s_articulo.find('div', attrs={'class':'article-tags'}).find_all('a')
        for i in copete:
            print(i.text)
        # Extrae el autor
        autor = s_articulo.find('div', attrs={'class':'author-name'})
        print(autor.text)
        # Extrae el body
        cuerpo = s_articulo.find('div', attrs={'class':'article-main-content'})
        print(cuerpo.text)
except Exception as e:
    print(e)
# Recopilando titulo, fecha, autor, resumen y cuerpo del articulo:

try:
    art = requests.get(art_url)
    if art.status_code == 200:
        s_art = BeautifulSoup(art.text, "lxml")
        
        #Extract Title
        title = s_art.find('h1')
        summary = s_art.find('h3')
        author = s_art.find('div',attrs={'class':"author"})
        date = s_art.find('span')
        main_content = s_art.find('div', attrs={'class':'article-main-content article-text'}).find_all('p')
        print(title.text,'\n','\n',author.text,'\n','\n',date.text,'\n','\n',summary.text,'\n','\n',main_content)
except Exception as e:
    print ("Request Error")
    print (e)
    print ('\n')

#Código 7/12/2022
try:
nota = requests.get(url_nota)
if nota.status_code == 200:
s_nota = BeautifulSoup(nota.text,‘lxml’)

    #Extraemos titulo
    
    titulo = s_nota.find('div', attrs = {'class' :'col 2-col'}).h1.get_text()
    print(titulo)
    
    
    #Extraemos la fecha del articulo
    
    fecha = s_nota.find('time').get('datetime')
    print(fecha)
    
    #Extraemos el copete
    
    copete = s_nota.find('h2', attrs = {'class' :'h3'}).text
    print(copete)
    
    
    #Extraemos la volanta
    
    volanta = s_nota.find('h3', attrs = {'class' :'h4'}).text
    print(volanta)
    
    #Extraemos el cuerpo 
    
    cuerpo_a = s_nota.find('div', attrs = {'class' :'article-main-content article-text'}).find_all('p')
    cuerpo = [parrafo.text for parrafo in cuerpo_a]
    print(cuerpo)
    
    #Extraemos el author
    
    
    author = s_nota.find('div', attrs = {'class' :'author-name'})
    if author:
        print(author)
    else:
        print('Sin author encontrado')

except Exception as e:
print(‘Error:’)
print(e)
print(’\n’)

url = 'https://www.lanacion.com.ar/'

def main(url:str):
  response = requests.get(url)

  if response.status_code == 200:
    s = BeautifulSoup(response.text, 'lxml')

    sections = s.find_all('h2')

    sections_links = [url + section.a.get('href') for section in sections]
    
    return sections_links

url = 'https://www.lanacion.com.ar'

links_articulos = main(url)
links_articulos

try:
  response = requests.get(link_articulo)

  if response.status_code == 200:
    article = BeautifulSoup(response.text, 'lxml')

    #Se extrae el titulo
    title = article.find('h1')

    print(title.get_text())
    print('\n')

    #Se extrae
    subtitle = article.find('h2')

    print(subtitle.get_text())
    print('\n')

    paragraphs = article.find_all('p', 'com-paragraph --s')
    # print(paragraphs)

    for paragraph in paragraphs:
      print(paragraph.get_text())
      print('\n')


except Exception as e:
  print('Error:')
  print(e)
  print('\n')
def get_notice(url):
    """
    Definición: Extracción de fecha, titulo, volanta, copete y cuerpo de la noticia.
    
    Parámetro: 
    -url: Link de la noticia a procesar (perteneciente al portal de noticias Argentino pagina12).
    
    Retorno: Fecha, titulo, volanta, copete y cuerpo de la noticia.   
    """
    try:
        nota = requests.get(url)
        if nota.status_code == 200:
            s_nota = BeautifulSoup(nota.text, "lxml")
            #Extraemos la fecha de la noticia
            fecha = s_nota.find("div", attrs={"class" : "date"}).find("span", attrs= {"class": "p12-separator--right--gray"}).text
            print(fecha)
            #Extraccion del titulo
            titulo = s_nota.find("div", attrs={"class": "col 2-col"}).find("h1")
            print("Título de la noticia:",titulo.text)
            #Extraemos la volanta de la noticia
            volanta = s_nota.find("div", attrs={"class": "col 2-col"}).find("h4")
            print("\n")
            print("Volanta de la noticia:",volanta.text)
            #Extraemos el copete de la noticia
            print("\n")
            copete = s_nota.find("div", attrs={"class": "col 2-col"}).find("h3")
            print("Copete:",copete.text)
            #Extraemos el cuerpo de la noticia
            print("\n")
            cuerpo = s_nota.find("div", attrs={"class":"article-main-content article-text"}).find_all("p")
            for parrafo in cuerpo:
                print(parrafo.get_text())
    except Exception as e:
        print('Error:', e)
        print("\n\n")

Hola dejaré por acá abajo mi código. He de decir que me olvidé de agregar el try-except.

Es un código breve en el que hallé solamente el titular y el cuerpo de la noticia.

import requests
url = 'https://meridiano.net/beisbol/beisbol-grandes-ligas/249735/tigres---esperamos-que-miggy-vuelva-a-la-caja-de-bateo-este-ano-.html'
pag = requests.get (url)

from bs4 import BeautifulSoup
s = BeautifulSoup (pag.text, 'lxml')

seccion = s.find ('div', attrs = {'id':'MZone'})

secciones_h1 = seccion.find_all ('h1')
seccion_titular = secciones_h1 [1].get_text ()

secciones_p = seccion.find_all ('p')
 seccion_cuerpo_1 = secciones_p [3].get_text ()
 seccion_cuerpo_2 = secciones_p [4].get_text ()
 seccion_cuerpo_3 = secciones_p [8].get_text ()
 seccion_cuerpo_4 = secciones_p [9].get_text ()
seccion_cuerpo = seccion_cuerpo_1 + seccion_cuerpo_2 + seccion_cuerpo_3 + seccion_cuerpo_4

seccion_titular
seccion_cuerpo

Hola, si se te dificultó un poco identificar la fecha.
mira, esta es la linea de codigo que encuentra la fecha.
Fecha de creacion de codigo: 17/12/2023:

date_pub = s_nota.find('div',attrs={'class':'date modification-date ff-14px'}).find('span')

posiblemente, esto no funcioné en varios años, pero es porque se actualiza.

try:
nota= requests.get(url_notas)
if nota.status_code==200:
s_nota = BeautifulSoup(nota.text,‘lxml’)
#extraemos el titulo
titulo=s_nota.find(‘h1’)
print(titulo.text)
#extraer fecha
fecha= s_nota.find(‘span’).text
print(fecha)
#extraer el Copete
copete= s_nota.find(‘h2’, attrs= ‘h4’)
print(copete)
# Extraemos la volanta
volanta= s_nota.find(‘h2’, attrs= ‘h3’)
print(volanta)
#Extraemos el cuerpo
cuerpo= s_nota.find(‘div’, attrs=‘section-2-col article-main-content’)
print(cuerpo)
#Extraemos el autor"
autor =s_nota.find(‘div’, attrs=‘author’)

except Exception as e:
print(‘Error:’)
print(e)
print(’/n’)

Se notan los nombres específicos del país como Copete o Volanta…

hola aquí dejo mi código actualizado a marzo de 2023 ya que la pagina ha cambio con el tiempo

try:
  nota = requests.get(link)
  if nota.status_code == 200:
    s_nota = BeautifulSoup(nota.text,'lxml')
    #extract titel
    title = s_nota.find('h1').get_text()
    print(title)

    #extract time
    div_time = s_nota.find('div',{'class':'date modification-date'})
    time = div_time.span.time.get('datetime')
    print(time)

    #extrac copete
    copete_h2 = s_nota.find('h2',{'class':'h3'})
    copete = copete_h2.get_text()
    print(copete)

    #extrac autor
    div_autor = s_nota.find('div',{'class':'author-name'})
    autor = div_autor.get_text()
    print(autor)

except Exception as e:
  print('Error: ',e)

Codigo para hoy 20/3/2021

try:
    nota = requests.get(url_articulo)
    if nota.status_code == 200:
        soup_nota = BeautifulSoup(nota.text, "html.parser")
        # Tittle
        title = soup_nota.find("h1", attrs={
            "class": "article-title"
        }).text
        # Fecha
        fecha = soup_nota.find("div", attrs={
            "class": "time"
        }).find("span").get("datetime")
        print(fecha)    
except Exception as e:
    print('Error', e)
    print('\n')