No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Quedan menos de 24 hrs para aprender Ingl茅s, AI y m谩s a precio especial.

Antes: $249

Currency
$209
Suscr铆bete

Termina en:

0 D铆as
0 Hrs
11 Min
12 Seg

Descargando contenido

8/30
Recursos

Aportes 90

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') > 

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')

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')

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 鈥減lan motosierra鈥
鈥淟a 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.鈥淣o 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. 鈥淓stamos 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. 鈥淓ste 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鈥. 鈥淟a 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. 鈥淣osotros no tenemos un problema con el FMI porque nuestras metas fiscales son m谩s ambiciosas que las del propio Fondo鈥, concluy贸.

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')

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)
        

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: 鈥淎vanzamos en lineamientos del programa que reemplazar谩 al fallido鈥

2020-11-21

鈥淟a 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 鈥渓os lineamientos del programa que reemplazar谩 el fallido programa anterior鈥, ejecutado entre la gesti贸n de Mauricio Macri y la francesa Christine Lagarde.鈥淟a premisa es crecer para apuntalar la estabilizaci贸n econ贸mica鈥, remarac贸 el funcionario nacional, al tiempo que se帽al贸 que 鈥渃on la misi贸n del FMI avanzamos en los lineamientos del programa que reemplazar谩 el fallido programa anterior鈥.鈥淒eber谩 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 鈥渞esolver鈥 la 鈥渃risis macro y de deuda鈥 y establecer un programa sostenible.鈥淓l 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 鈥渓as 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 鈥渁vances鈥 ante la intenci贸n de la Argentina de solicitar un nuevo programa de apoyo, pero advirti贸 que 鈥渟e 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 鈥渆s importante entender que esto es un proceso鈥 y estim贸 que no se llegar谩 a un acuerdo con el organismo multilateral durante este a帽o.
鈥淣o 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.

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') 

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')
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')

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')

En mi caso prefer铆a hacerlo con la p谩gina de Infobae. La funci贸n recibe un URL y con ese hace todo el proceso de extracci贸n de los datos.

def contenido(url):
    
    try:
        nota = requests.get(url)
        if nota.status_code == 200:
            s_nota = bs(nota.text, 'lxml')

            #Extraemos el t铆tulo
            titulo = s_nota.find('h1', attrs={'class':'article-headline | bold width_full'})
            print(titulo.text)

            # Extaemos la fecha del art铆culo
            fecha = s_nota.find('div', attrs={'class':'datetime | display_inline byline_datetime'})
            print(fecha.text)
            
            # Extraemos el sub-titulo
            sub_titulo = s_nota.find('h2', attrs={'class':'article-subheadline | article-subheadline padding_vertical_5px border_bottom border_1 border_lightgray width_full'})
            print(sub_titulo.text)
            
            # Extraemos el nombre del autor
            autor = s_nota.find('span', attrs={'class':'author | margin_horizontal_5px bold'}).find('a')
            print(autor.text)
            
            # Extraemos la imagen del articulo
            imagen = s_nota.find('img', attrs={'alt':'Maradona, entre l谩grimas, en el Mundial 90'}).get('src')
            print(imagen)
            
            # Extraemos el caption de la imagen
            caption = s_nota.find('figcaption', attrs={'class':'padding_vertical_15px padding_horizontal_15px'})
            print(caption.text)
            
            # Extraemos el texto del articulo
            parrafos = s_nota.find_all('p', attrs={'class':'paragraph'})
            parrafo = parrafos[0]
            texto = [parrafo.text for parrafo in parrafos]
            print(texto)
            
    except Exception as e:
        print('Error')
        print(e)
        print('\n')
        
contenido('https://www.infobae.com/cultura/2020/11/26/maradona-la-lengua-y-el-llanto-argentino/')

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.

#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 鈥渃alidad 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 鈥渃uesti贸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 estn adentro. Son cerca de 115.000 familias. Menos del 1 por ciento (0,6 por ciento para ser exacto) estn 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 estn 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 鈥渟eguro鈥, aunque no lo sea t茅cnicamente. Los pagos mensuales a este 鈥渟eguro鈥 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
'''
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')```

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,鈥榣xml鈥)
#extraemos el titulo
titulo=s_nota.find(鈥榟1鈥)
print(titulo.text)
#extraer fecha
fecha= s_nota.find(鈥榮pan鈥).text
print(fecha)
#extraer el Copete
copete= s_nota.find(鈥榟2鈥, attrs= 鈥榟4鈥)
print(copete)
# Extraemos la volanta
volanta= s_nota.find(鈥榟2鈥, attrs= 鈥榟3鈥)
print(volanta)
#Extraemos el cuerpo
cuerpo= s_nota.find(鈥榙iv鈥, attrs=鈥榮ection-2-col article-main-content鈥)
print(cuerpo)
#Extraemos el autor"
autor =s_nota.find(鈥榙iv鈥, attrs=鈥榓uthor鈥)

except Exception as e:
print(鈥楨rror:鈥)
print(e)
print(鈥/n鈥)

8. Descargando contenido

try:
    nota = requests.get(url_mela)
    if nota.status_code == 200:
        s_nota = BeautifulSoup(nota.text, 'lxml')
        # Extraemos el titulo
        titulo = s_nota.find('h1')
        print(titulo.get_text())
        # Extraer la fecha
        fecha = s_nota.find('time').get('datetime').split('T')[0]
        print(fecha)
        # Extraer el copete
        copete = s_nota.find('h2', attrs={'class':'h3'})
        print(copete.get_text())
        # Extrer la volanta
        volanta = s_nota.find('h2', attrs={'class':'h4'})
        print(volanta.get_text())
        # Extraer el cuerpo
        cuerpo = s_nota.find('div', attrs={'class':'article-main-content article-text'})
        print(cuerpo.get_text())
        # Extraer autor
        autor = s_nota.find('div', attrs={'class':'author-name'})
        print(autor.get_text())

        

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

    #s_seccion.find('div', attrs={'class':'article-list'})

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)

Anotaciones y Ejercicios Curso de Web Scraping - Modulo II
Si tienes dudas te dejo todas las anotaciones del curso actualizados al 2023, tome nota de los comentarios y ejercicios resueltos de cada secci贸n. Lleve en cuenta las explicaciones del docente y m谩s! Espero les sirva. 馃憣
(si quieres apoyar deja una estrella a la repo 鉁屸瓙)

#C贸digo 7/12/2022
try:
nota = requests.get(url_nota)
if nota.status_code == 200:
s_nota = BeautifulSoup(nota.text,鈥榣xml鈥)

    #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(鈥楨rror:鈥)
print(e)
print(鈥橽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

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")
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')
# 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')

Pude generar la obtenci贸n de contenido para el diario peruano el trome.( 17 Julio 2022)

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)

Reto cumplido con url https://www.pagina12.com.ar/399234-correo-argentino-la-igj-invalido-una-asamblea-de-socma-cuest

try:
    nota = requests.get(urlNota)
    if nota.status_code == 200 :
        s_nota = BeautifulSoup(nota.text,'html.parser')
        #Extraer el titulo
        titulo = s_nota.find('article',attrs={'class':'article-full section'}).find('h1').text
        #Extraer fecha
        fecha = s_nota.find('div',attrs={'class':'date modification-date'}).find('time').get('datetime')
        #Extraer el copete
        copete = s_nota.find('div',attrs={'class':'article-tags'}).find_all('a')
        copete = " ".join([c.text for c in copete])
        #Extraer Volanta
        volanta = s_nota.find('h4').text
        #Extraer el autor
        autor = s_nota.find('div',attrs={'class':'author-name'}).text
        #Extraer el cuerpo
        cuerpo = s_nota.find('div',attrs={'class':'article-main-content article-text'}).text
except Exception as e:
    print(e)

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')

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')

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()

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')

Aora Octubre 2021:
Los 鈥榟ref鈥 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

El orden del c贸digo est谩 feo y funciona a la fecha del 20-junio-2021:

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)
    ```

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')

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')

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 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')
        
        # 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')```

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')

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:

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

Como descargaria contenido de una seccion privada de un website.

O sea que tenga que autenticarme o pasar un token para acceder a esos recursos.

Tenemos una sesion al respecto?

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')```

try:
nota = requests.get(url_nota)
if nota.status_code == 200:
s_nota = BeautifulSoup(nota.text, 鈥榣xml鈥)
#Extraemos el titulo
titulo = s_nota.find(鈥榟1鈥, attrs={鈥榗lass鈥:鈥榓rticle-title鈥檥)
print(titulo.text)
#Extraer la fecha
fecha = s_nota.find(鈥榮pan鈥, attrs={鈥榩ubdate鈥 : 鈥榩ubdate鈥檥).get(鈥榙atetime鈥)
print(fecha)
#Volanta
volanta = s_nota.find(鈥榟2鈥,attrs = {鈥榗lass鈥 : 鈥榓rticle-prefix鈥檥)
print(volanta.text)
#Copete o bajada(resumen)
copete = s_nota.find(鈥榙iv鈥, attrs={ 鈥榗lass鈥 : 鈥榓rticle-summary鈥檥)
print(copete.text)
#cuerpo
cuerpo = s_nota.find(鈥榙iv鈥, attrs={ 鈥榗lass鈥 : 鈥榓rticle-text鈥檥)
print(cuerpo.text)

except Exception as e:
print(鈥楨rror: 鈥)
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')```

馃槂

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')```

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')

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'})

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')

Comparto mi c贸digo. Cambie la variable 鈥渘ota鈥 por 鈥減ost鈥

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?

Excellent!

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')

Soluci贸n al reto, C贸digo:

Output:


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
        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}')
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')```

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')```

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')
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')

Este es mi c贸digo:

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 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')```

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')

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')
    

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')```

Sorprendido por la experiencia de escribir el c贸digo paso a paso y ver los resultados esperados:

Reto al 23/Sep/2020

try:
nota= requests.get(url_nota)
if nota.status_code== 200:
S_nota = BeautifulSoup(nota.text,鈥榣xml鈥)
print(nota.url)
titulo = S_nota.find(鈥榟1鈥, attrs={鈥榗lass鈥:鈥榓rticle-title鈥檥).get_text()
print(鈥楾utulo de Nota:\n鈥,titulo)
fecNews = S_nota.find(鈥榮pan鈥, attrs={鈥榩ubdate鈥:鈥榩ubdate鈥檥).get(鈥榙atetime鈥)
print(鈥楩echa de Nota:\n鈥,fecNews)
# copete
copete = S_nota.find(鈥榟2鈥, attrs={鈥榗lass鈥:鈥榓rticle-prefix鈥檥).get_text()
print(鈥楥opete de Nota:\n鈥,copete)
#Volanta
volanta = S_nota.find(鈥榙iv鈥, attrs={鈥榗lass鈥:鈥榓rticle-summary鈥檥).get_text()
print(鈥榁olanta de Nota:\n鈥,volanta)
except Exception as e:
print(鈥楨rror: 鈥, e,鈥橽n鈥)

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 esten 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```
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')

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')