Introducción

1

Qué aprenderás sobre la ingeniería de datos

2

Archivos del curso y Slides

3

¬ŅQu√© es la Ciencia e Ingenier√≠a de Datos?

4

Roles

5

Configuración del ambiente

6

Jupyter Notebooks

7

Profundizando en tipos de datos

8

Tipos de datos

9

Fuentes de datos

10

ETL

Web scraping

11

Introducción a las tecnologías web

12

Realizar solicitudes HTTP con Python

13

¬ŅC√≥mo trabajar con un documento HTML?

14

Analizando un sitio web para encontrar las directivas a utilizar al hacer un web scrapping

15

Solicitudes a la web: Requests

16

Implementando nuestro web scrapper: Configuración

17

Implementando nuestro web scrapper: Obteniendo enlaces del front page

18

Implementando nuestro web scrapper: Obteniendo artículos

19

Obtención de datos del Artículo

20

Persistiendo la información "scrapeada"

Pandas

21

Introducción a Pandas

22

Estructura de datos: Series

23

Estructura de datos: DataFrames

24

√ćndices y selecci√≥n

25

Data wrangling con Pandas

26

Creación de la receta: preparando la automatización

27

¬ŅC√≥mo trabajar con datos faltantes?

28

Operaciones con Series y DataFrames

29

Limpiando detalles adicionales

30

Limpiando detalles en nuestro proyecto

31

Enriquecimiento de los datos

32

Valores duplicados en Jupyter

33

Valores duplicados en Python

34

Visualización de datos

Intro a Sistemas de Datos

35

Introducción a los sistemas de datos

36

Automatización del Pipeline

37

Cargando datos a SQLite

Contenido Bonus

38

¬ŅPor qu√© usar la nube?

No tienes acceso a esta clase

¬°Contin√ļa aprendiendo! √önete y comienza a potenciar tu carrera

Analizando un sitio web para encontrar las directivas a utilizar al hacer un web scrapping

14/38
Recursos

Para poder desarrollar scrapers debemos entender los datos semi estructurados dados por el HTML para determinar qué tipo de selectores CSS necesitamos para sacar información.

Aportes 165

Preguntas 18

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

Hola

Les comparto el ejercicio que realicé con la página del periódico El Tiempo:

import requests
import bs4

url = "https://www.eltiempo.com"

response = requests.get(url)

soup = bs4.BeautifulSoup(response.text, 'html.parser')
news = soup.select('.title-container a')

for item in news:
    print(f"Noticia:{item.text} | Link: {url}{item['href']}")

Web Scraping a pagina ** jkanime** de la programaciòn.

import requests, bs4

response = requests.get('https://jkanime.net/')
soup = bs4.BeautifulSoup(response.text, 'html.parser')

animes = soup.select('.overview a')

for count,anime in enumerate(animes):
    print('{}. Titulo: {}'.format(count +1, anime['title']))
    print('   Enlace: {}'.format(anime['href']))

obtener href

import bs4
import requests

response = requests.get('https://www.eluniversal.com.mx/')
soup = bs4.BeautifulSoup(response.text,'html.parser')

# get links
links = soup.select('.field-content a')
hrefs  = [ link.attrs.get('href') for link in links ] 
cantidad_de_links = len(hrefs)

for href in hrefs:
    print(href)

Aquí mi primer aportación. Obtener los encabezados de los artículos pero sin el href

newsLenght = len((soup.select('.field-content h1')))
newsHeaders =[]



for i in range(newsLenght - 1):
    header = (soup.select('.field-content h1')[i]).text
    newsHeaders.append(header)
    
print(newsHeaders)
    

Para la p√°gina de el tiempo:

import bs4
import requests
respuesta=requests.get('https://www.eltiempo.com/')
#respuesta.encoding = 'utf-8'
soup= bs4.BeautifulSoup(respuesta.text, 'html.parser' )

#print(soup.prettify())
#print(soup.title.text)
#print(soup.select('meta[name=description]')[0]['content'])
article_links= soup.select('.title-container a')
#print(article_links[0]['href'])

articles = ['https://www.eltiempo.com'+article['href'] for article in article_links]
for article in articles:
    print(article)

Extraer Titulo, autor y URL de libros gratis sobre Machine Learning de la editorial Springer a partir de un post en towardsdatascience.com

Curiosamente, el post habla de 65 libros, pero solo hay 64 en el post.

import requests
from bs4 import BeautifulSoup

url = 'https://towardsdatascience.com/springer-has-released-65-machine-learning-and-data-books-for-free-961f8181f189'

urlResponse = requests.get(url)
urlResponse.encoding = 'utf-8'

if urlResponse.status_code == 200:
    soup = BeautifulSoup(urlResponse.text, 'html.parser')

    print(f'Title: {soup.title.text}')
    print('Description: {}'.format(soup.select('meta[name=description]')[0]['content']))
    
    booksLinks = soup.article.find('h1',text='The 65 books list:').find_all_next('p')    
    
    print()
    
    numberOfLines = len(booksLinks)-1
    
    for number, book in enumerate(booksLinks):
        
        if number < numberOfLines: # hide undesirable last line
            sequence = int((number + 3) / 3)
            bullet = sequence if ((number + 3) // 3 * 3 == (number + 3)) else ' ' * len(str(sequence))
            print(bullet, book.text)
            
            
else:
    print(f'Error: {urlResponse.reason}')

Ejemplo del resultado:

Title: Springer has released 65 Machine Learning and Data books for free
Description: Springer has released hundreds of free books on a wide range of topics to the general public. The list, which includes 408 books in total, covers a wide range of scientific and technological topics…

1 The Elements of Statistical Learning
  Trevor Hastie, Robert Tibshirani, Jerome Friedman
  http://link.springer.com/openurl?genre=book&isbn=978-0-387-84858-7
2 Introductory Time Series with R
  Paul S.P. Cowpertwait, Andrew V. Metcalfe
  http://link.springer.com/openurl?genre=book&isbn=978-0-387-88698-5
3 A Beginner’s Guide to R
  Alain Zuur, Elena N. Ieno, Erik Meesters
  http://link.springer.com/openurl?genre=book&isbn=978-0-387-93837-0
respuesta_espectador =  requests.get('https://www.elespectador.com/noticias/')
noticia = bs4.BeautifulSoup(respuesta_espectador.text, 'html.parser')
Noticias = noticia.select('.field--name-title a' )
titulo_Noticias = [x.text for x in Noticias]

for x in titulo_Noticias:
    print(x)

Hola.

Acá comparto el código que utilicé para extraer los títulos junto a los artículos de la página de la BBC en su sección de tecnología:

Acá pongo la función que hice para automatizar web scrapping de noticias virtuales.
url_base: url de la p√°gina principal
html_articulo: clase donde encuentras el url en el html
html_titulo: al ingresar al link del artículo, es la clase donde encuentras el html del título
html_cuerpo: clase donde encuentra el html del texto del cuerpo

def obtener_news(url_base, html_articulo, html_titulo, html_cuerpo):
    import requests
    import bs4

    #Se hace el BS para la página principal y obtener los links de los artículos
    response1 = requests.get(url_base)
    response1.encoding="utf-8"
    soup1 = bs4.BeautifulSoup(response1.text, "html.parser")
    
    #Segun el tipo de texto html que indica el link de artículos
    articulos = soup1.select( html_articulo )
    articulos = [url_base + articulo.a["href"] for articulo in articulos]
    
    
    #Se Crean variables vacias para anexar los titulos y los textos
    articulo_titulos = []
    articulo_textos = []

    #Se hace un ciclo por cada artículo del periódico
    for articulo in articulos:
        
        #Se toma de cada link el t√≠tulo y el texto y se a√Īade en la variable designada
        response_n = requests.get(articulo)
        response_n.encoding="utf-8"
        soup_n = bs4.BeautifulSoup(response_n.text, "html.parser")
        titulo = soup_n.select( html_titulo )[0].text
        cuerpo = soup_n.select( html_cuerpo )[0].text
        
        #Se anexa el título y el texto en las variables vacías
        articulo_titulos.append(titulo)
        articulo_textos.append(cuerpo)

    return articulos, articulo_titulos, articulo_textos```

Noticias de El Comercio (Peru)

import requests
import bs4
from IPython.display import Markdown, display_markdown

url = 'https://elcomercio.pe/'

response = requests.get(url)
soup = bs4.BeautifulSoup(response.text, 'html.parser')
news = soup.select('.fs-wi__title a')

for new in news:
    display_markdown(Markdown(f"### **Titulo: {new.text}** \n Enlace: {url + new['href']}"))

Con BeautifulSoup se puede trabajar con selectores xpath, como con Scrapy o solo selectores CSS?

Mi script para descargar los links de la sección de tecnología del NYT:

nyt = requests.get("https://www.nytimes.com/section/technology")
soup = bs4.BeautifulSoup(nyt.text, 'html.parser')
print(soup.select('meta[name=description]')[0]['content'])
notas_links = soup.select('.css-ye6x8s a')
notas_nyt = [nota['href'] for nota in notas_links]

for nota in notas_links:
  print(f'Titulo: {nota.text} El link es: {nota["href"]}')

Les comparto el scrapping que hice al Universal, extrayendo el título de sus noticias y la url:

import requests
import bs4

response = requests.get('https://www.eluniversal.com.mx/')
response.encoding ='utf-8'
soup = bs4.BeautifulSoup(response.text,'html.parser')

noticias = soup.select('.ce2-Tipo1_Titulo')

#url
# noticias[0].a['href']
#titulo
# noticias[0].a.contents[0]

titulos = [tit.a.contents[0] for tit in noticias]
titulos

urls = [u.a['href'] for u in noticias]
urls

La Razon - Bolivia

import requests
response = requests.get('http://www.la-razon.com/')
import bs4
soup = bs4.BeautifulSoup(response.text,'html.parser')
print(soup.title.text,'\n')
print(soup.select('meta[name=KEYWORDS]'),'\n')
print(soup.select('meta[name=KEYWORDS]')[0]['content'])
courses_titulos = soup.select('.bd h2 a')
#courses = [course.attrs.get('href') for course in courses_links]
courses_contenidos = soup.select('.tx p')

for i in range(0,len(courses_titulos)):
    print(courses_titulos[i].text,'\n')
    print(courses_contenidos[i].text,'\n','\n')

Un gran desafío, mis felicitaciones al chef…

Les comparto mi código, espero les agrade, aun intento apegarme al PEP8.

''' This code gets the daily news from "El universal" '''
import request
import bs4

response = requests.get('https://www.eluniversal.com.mx/')

#making the soup
soup = bs4.BeautifulSoup(response.text, 'html.parser')

#Printing the title
print((soup.title.text) + '\n\n')

#select from class = "field-content" only the tags h1
newsLenght = len((soup.select('.field-content h1')))
data = []
# data = {}

#Getting headers from the news
for i in range(newsLenght - 1):
    
    news =  (soup.select('.field-content h1 a')[i])
    link =  news.get('href')
    
    #getting response from the newlink
    responseLink = requests.get('https://www.eluniversal.com.mx'+link)
    

    #making the soup from responseLink
    souplink = bs4.BeautifulSoup(responseLink.text, 'html.parser')  

    #Getting the title of the news
    newsTitle = souplink.title.text
    
    #Extracting the paragraphs from the newlink
    paragraphsLength = len((souplink.select('.pane-content p')))    
    
    paragraphsText = ''
    
    for j in range(paragraphsLength - 2):
        
        if j == 0:
            pass
        else:
            paragraph = (souplink.select('.pane-content p')[j]).text

            paragraphsText += (paragraph + '\n')

    "There are two alternatives ussing lists or ussing dictionaries, choose your poison"
    data.append([newsTitle, paragraphsText])
    

#Printing Data    
for k in range(len(data)):
    print('=== ' + data[k][0] + ' ===' + '\n' + data[k][1] ) 


Esta es mi solucion para selecccionar todos los titulares del universal de Mexico:

import requests
import bs4

response = requests.get('https://www.eluniversal.com.mx/')
soup = bs4.BeautifulSoup(response.text, 'html.parser')

titlesH1 = soup.select('h1.field-content a')
titlesH2 = soup.select('h2.field-content a')

titles = [title.get_text() for title in titlesH1] + [title.get_text() for title in titlesH2]

print(len(titles))

for title in titles:
    print(title)
import requests
import bs4
response = requests.get('https://actualidadpanamericana.com/')
soup = bs4.BeautifulSoup(response.content, 'html.parser')
page_anchors = soup.select('.post-title a')
#anchors_hrefs = [anchor['href'] for anchor in page_anchors]
for anchor in page_anchors:
    print(anchor["title"] + "-" + anchor["href"])

Web Scrapping a la pagina de ‚Äė‚ÄėLa Hora‚Äô‚Äô de sus links y sus contenido


import bs4
import requests

URL = 'https://lahora.com.ec'
response = requests.get(URL)

soup = bs4.BeautifulSoup(response.text, 'html.parser')

noticias = soup.select('.noticia h4 a')

link_noticias = [noticia['href'] for noticia in noticias]


for link in link_noticias:
    
    link = link
    URL_son = '{}{}'.format(URL, link)
    
    response = requests.get(URL_son)
    
    soup = bs4.BeautifulSoup(response.text, 'html.parser')
    
    contexts_notice = soup.select('.content p')
    
    contexts = [context.text for context in contexts_notice]
    
    print('{}:'.format(URL_son), r'\n')
    
    for context in contexts: 
        print(context)

Algo de web scrapping a la p√°gina de El Tiempo.

import requests
import bs4

test = requests.get('https://www.eltiempo.com/')
s = bs4.BeautifulSoup(test.text, 'html.parser')

articles_links = s.select('.title-container')
articles = [article.select('a')[0]['href'] for article in articles_links]

for article in articles:
    print(article)

realice el programa del curso pero siempre fala por algun motivo no doy con los selectores css

Para los enlaces de elmundo.es

import bs4
import requests
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
response = requests.get('https://www.elmundo.es/', headers=headers)
soup = bs4.BeautifulSoup(response.text, 'html.parser')
divs_a = soup.select('a')
notas_links = [nota['href'] for nota in divs_a]
print(notas_links[0])
for nota in notas_links:
    print(nota)
    print(soup.select('meta[name=description]'),'\n')

Periódico universal colombia

import requests
response = requests.get('https://www.eluniversal.com.co/')
import bs4
soup= bs4.BeautifulSoup(response.text, 'html.parser')
article_links = soup.select ('.template-eu-16 a')
articles = [article['href'] for article in article_links]

for article in articles:
    print(article)
response = requests.get('https://www.elcolombiano.com/')
soup = bs4.BeautifulSoup(response.text, 'html.parser')
Links_art = soup.select('.right h3 a')

links = [link['href'] for link in Links_art]
print(1)
for link in links:
    print(link)
    print('----------')

Aquí pueden encontrar documentación muy interesante sobre BeautifulSoup.

obtener las principales noticias del elcomercio.

url = 'https://elcomercio.pe/'
response = requests.get(url)
soup = bs4.BeautifulSoup(response.text, 'html.parser')
# noticias principales
noticias_html = soup.select('.featured-story')
noticias = []
for noticia_html in noticias_html:
    noticias.append({
        'Categoria': noticia_html.select('.featured-story__category-link')[0].text,
        'Titulo': noticia_html.select('.featured-story__title-link')[0].text,
        'Autor': noticia_html.select('.featured-story__author')[0].text
    })
print(noticias)
#Trabajo con un periodico local

url = "https://www.laopinion.com.co/#OP"

response = requests.get(url)

soup = bs4.BeautifulSoup(response.text, 'html.parser')
news = soup.select('.titulo a')

hrefs  = [ link.attrs.get('href') for link in news ] 
cantidad_de_links = len(hrefs)

for href in hrefs:
    print(href)
<h1>Código para analizar el periódico Proceso</h1>
# Titulos del carrusel en la pagina principal del Proceso
news_title = soup.select('.carouselck_caption_title')
news = [(item.text.strip()) for item in news_title]
print(news)
print()

# Noticias destacadas
featured_links = soup.select('.vc_gitem-post-data-source-post_title a')

featured = dict()
#Crea un diccionario con {url:titulo-noticia}
for i in featured_links :
    featured[i['href']] = i.text

for k,v in featured.items() :
    print(f'Noticia: {v} \n{k}\n')

Hola compa√Īeros.
Comparto mi ejercicio

import bs4
import requests
url = 'https://www.lanacion.com.ec’
response = requests.get(url)
soup = bs4.BeautifulSoup(response.text,‚Äėhtml.parser‚Äô)

news = soup.select(’.entry-title a’)

for lineas in news:
print(f"Titulares : {lineas.text} \n “)
print(f"Referencia: {lineas[‚Äėhref‚Äô]} \n\n‚ÄĚ)

Tags del periódico El Heraldo de Barranquilla:

import bs4
import requests

response = requests.get('https://www.elheraldo.co/')
soup=bs4.BeautifulSoup(response.text,'html.parser')

tags_links=soup.select('.datos span')
tags=[tag for tag in tags_links]

for tag in tags:
    print(tag.text)

Comparto mi ejercicio

import requests
import bs4

url = ‚Äėhttps://www.eluniversal.com.co/‚Äô

response = requests.get(url)
response.encoding = 'utf-8’
soup = bs4.BeautifulSoup(response.text, ‚Äėhtml.parser‚Äô)

look_for = [‚ÄėCOVID‚Äô, ‚ÄėTAPABOCAS‚Äô, ‚ÄėCORNAVIRUS‚Äô, ‚ÄėVACUNA‚Äô]

news = soup.select(’.info a’)
covidNews = [cnew for cnew in news if (len(list(filter(lambda x : x in cnew.text.upper(), look_for))) > 0)]

nums = [0,1,5]

for new in covidNews:
print(f"{new.text} | {url}{new[‚Äėhref‚Äô]}")

Buenas tardes, este es el c√≥digo que realice conel periodico Reforma. Para solo tener el t√≠tulo me gu√≠e en el ejemplo de uno de mis compa√Īeros.

import bs4
import requests

response = requests.get('https://www.reforma.com/')

soup = bs4.BeautifulSoup(response.text, 'html.parser')

titles_links = soup.select('a[class=ligaonclick]')


for item in titles_links:
    print(item.text)

Hola, les comparto un texto obtenido a partir de la p√°gina The Tico Times:

***
import requests
import bs4

response = requests.get('https://ticotimes.net/2021/11/03/covid-in-costa-rica-hospitalizations-deaths-still-dropping')
soup = bs4.BeautifulSoup(response.text, 'html.parser')

searched_text = soup.select('.tdb-block-inner')

for searched in soup.find_all("p"):
    print(searched.get_text())
***

El siguiente codigo obtiene los titulos y los vinculos y ademas de cada vinculo trae el titulo, el resumen y el cuerpo de cada articulo. aun ffalta filtrar la informacion para eliminar los hipervinculos en el texto.

import requests
import bs4

url = 'https://www.as.com'

response = requests.get(url)

soup = bs4.BeautifulSoup(response.text, 'html.parser')

print(soup.title.text)

news = soup.select('.title a')

for item in news:
    print(f"Noticia:{item.text} | Link: {item['href']}")

link = []
for item in news:
    href = item['href']
    link.append(href)
print(link)
print(len(link))

import urllib.request


for item in link:
    try:
        source = urllib.request.urlopen(item)
        sopa = bs4.BeautifulSoup(source, 'html.parser')
        noticia = sopa.select('.art-headline')
        resumen = sopa.select('.art-opening')
        contenido = sopa.select('.int-articulo p')
        
    except ValueError:
        print(ValueError)
  
    
    print(noticia)
    print(resumen)
    print(contenido)

Usé el portal de noticias de México de Milenio:

import requests
import bs4

responseMilenio = requests.get('https://www.milenio.com/ultima-hora')
soupMilenio = bs4.BeautifulSoup(responseMilenio.text, 'html.parser')
news_links = soupMilenio.select('.title')
for new in news_links:
    print(f'{new.a.h2.text}: \n{new.a["href"]}')
    print('_'*100)
Barcelona vs Bayern M√ļnich EN VIVO - VER Champions League HOY: 
/deportes/futbol-internacional/barcelona-vs-bayern-munich-envivo-champions-league
____________________________________________________________________________________________________
Fiscalía de SLP investiga presunto secuestro de 20 extranjeros en Matehuala: 
/estados/fiscalia-slp-investiga-presunto-secuestro-20-extranjeros
____________________________________________________________________________________________________
Compra de dólares del gobierno federal al Banxico, con probable pago a deuda: IMEF: 
/negocios/imef-compra-dolares-banxico-pagar-deuda-pemex-banco-base
____________________________________________________________________________________________________
Otorgan suspensión a estudiantes en CdMx para que no sean obligados a ir a aulas: 
/policia/otorgan-suspension-estudiantes-cdmx-clases-aulas
____________________________________________________________________________________________________
¬°√Čntrenle al chismecito! 'ChisMorras', el nuevo podcast hecho por y para mujeres: 
/tecnologia/internet/chismorras-el-podcast-hecho-por-y-para-mujeres
____________________________________________________________________________________________________
EU restringirá a la policía federal el uso de llaves de estrangulamiento para detenciones: 
/internacional/estados-unidos/eu-imitara-llaves-estrangulamiento-policia-federal
____________________________________________________________________________________________________
IMSS recomienda a recién vacunados no beber alcohol durante fiestas patrias: 
/ciencia-y-salud/imss-recomienda-recien-vacunados-beber-alcohol-fiestas-patrias
____________________________________________________________________________________________________
Por crisis migratoria y pandemia, festejos patrios en Tapachula ser√°n a puerta cerrada: 
/estados/tapachula-anuncia-festejos-patrios-puerta-cerrada
____________________________________________________________________________________________________
Critican al Am√©rica por poner a sus jugadores en Castillo de Chapultepec y 'llamarlos' Ni√Īos H...: 
/deportes/extra-cancha/critican-america-jugadores-imagen-ninos-heroes
____________________________________________________________________________________________________
Con jacuzzi y una caja fuerte , as√≠ es la mansi√≥n de 'El Se√Īor de los Cielos' que ser√° sortead...: 
/politica/senor-cielos-mansion-sorteada-15-septiembre
____________________________________________________________________________________________________
Afectación por desastres naturales abre 'grieta' en recuperación económica: Concamin: 
/negocios/afectacion-desastres-naturales-abre-grieta-recuperacion-ip
____________________________________________________________________________________________________
Los Delfines de Miami se asocian con la mexicana Broxel para hacer su estadio cashless: 
/negocios/delfines-de-miami-se-asocian-con-la-mexicana-broxel
____________________________________________________________________________________________________
Secretaría del Bienestar inicia entrega recursos a damnificados por inundaciones: 
/politica/bienestar-inicia-entrega-recursos-damnificados-inundaciones
____________________________________________________________________________________________________
La batalla militar que pudo evitar que Dante Alighieri escribiera la 'Comedia': 
/cultura/laberinto/dante-batalla-militar-priva-divina-comedia
____________________________________________________________________________________________________
Por TV o en internet: aquí puedes ver el Grito de Independencia de AMLO de 2021: 
/politica/dondever-grito-independencia-amlo-2021-horario
____________________________________________________________________________________________________
"Nunca pude hacer click con un mexicano": Tabata Jalil, de 'VLA', habla de su divorcio: 
/espectaculos/famosos/tabata-jalil-divorcio-tendria-hijo-inseminacion-artificial
____________________________________________________________________________________________________
"Es peor a lo que imaginamos", dice Indira Vizcaíno sobre deuda de Colima: 
/estados/indira-vizcaino-por-deuda-en-colima-es-peor-de-lo-que-imaginamos
____________________________________________________________________________________________________
‚ÄúNo tienes √ļtero, c√°llate": Critican a Alexander Acha por hablar en contra del aborto: 
/espectaculos/famosos/alexander-acha-arremete-aborto-critican-tienes-utero
____________________________________________________________________________________________________
¬ŅListo para celebrar? Estos son los platillos que no deben faltar en tu cena del 15 de septiem...: 
/estilo/gastronomia/platillos-que-no-deben-faltar-en-tu-cena-del-15-de-septiembre
____________________________________________________________________________________________________
Fue a la est√©tica en lugar de ayudar en trabajo escolar; compa√Īeros la exhiben con foto viral: 
/virales/foto-viral-estudiante-abandona-equipo-estetica
____________________________________________________________________________________________________
Brujas vs PSG: Horario y dónde ver EN VIVO el partido de Champions League: 
/deportes/futbol-internacional/dondever-brujas-vs-psg-horario-partido-champions-league
____________________________________________________________________________________________________
¡Les ganó el hambre! Recién casados pasan a McDonald's antes de llegar a su fiesta; divertido ...: 
/virales/recien-casados-pasan-mcdonald-llegar-fiesta-video
____________________________________________________________________________________________________
Insabi y Unops generan mecanismo de distribución de medicamentos e insumos: 
/politica/comunidad/insabi-unops-crean-mecanismo-distribucion-medicamentos
____________________________________________________________________________________________________
Anuncian nuevas fechas de vacunación anticovid para rezagados en Villahermosa: 
/estados/villahermosa-anuncian-fechas-vacunacion-anticovid-rezagados
____________________________________________________________________________________________________
‚ÄúLlegar a la final de Leagues Cup no salva el mal paso de Pumas en Liga MX‚ÄĚ: Lillini: 
/deportes/futbol-internacional/leagues-cup-salva-torneo-pumas-andres-lillini
____________________________________________________________________________________________________
'La Divina Comedia', un libro de m√°s de 500 a√Īos: 
/cultura/divina-comedia-veia-infierno-dante-500-anos
____________________________________________________________________________________________________
Sader garantiza abasto de maíz  para fiestas patrias: 
/politica/comunidad/sader-garantiza-abasto-maiz-pozolero-fiestas-patrias
____________________________________________________________________________________________________
Muere en Inglaterra la madre del primer ministro brit√°nico, Boris Johnson: 
/internacional/muere-inglaterra-madre-ministro-britanico-boris-johnson
____________________________________________________________________________________________________
Segob pide no reproducir discursos de odio contra las mujeres: 
/politica/segob-pide-reproducir-discursos-odio-mujeres
____________________________________________________________________________________________________
Leucemia mieloide aguda crece en México entre población más joven: experta: 
/ciencia-y-salud/leucemia-mieloide-aguda-crece-mexico-jovenes-experta
____________________________________________________________________________________________________

Hola

Dejo mi ejercicio.
Accede a todas las noticias que estén en la primera plana y almacena los titulares y el contenido.

import bs4
import requests


def get_page():

    response = requests.get('https://www.lanuevaprensa.com.co/')
    soup = bs4.BeautifulSoup(response.text, 'html.parser')
    news_links = soup.select('.mnwall-title a')
    news_url = [item['href'] for item in news_links]
    return news_url

def request_maker(href_items: str):

    url = 'https://www.lanuevaprensa.com.co' + href_items
    response_dinamic = requests.get(url)
    return response_dinamic

def parser_maker(request_in: requests.models.Response):

    soup_dinamic = bs4.BeautifulSoup(request_in.text, 'html.parser')
    result_dict = {}
    itemTitle = soup_dinamic.select('.itemTitle')
    itemFullText = soup_dinamic.select('.itemFullText p')
    result_dict= {i.text:j.text for i,j in zip(itemTitle, itemFullText)}
    return result_dict

def news_details(news_url: list):

    details = []
    for url in news_url:
        result = request_maker(url)
        if '200' in str(result):
            result_data = parser_maker(result)
            details.append(result_data)
        else:
            pass
    return details


def main():

    print('Reto Platzi')
    newsurl = get_page()
    data = news_details(newsurl)
    for a in data:
        print(a)


if __name__ == "__main__":
    main()

Hola! Les comparto el ejercicio lo realicé con la página de Infobae

<code> 
import requests
import bs4

url = "https://www.infobae.com"

response = requests.get(url)

soup = bs4.BeautifulSoup(response.text, 'html.parser')
news = soup.select('.cst_ctn')


for item in news:
    print(f"Noticia:{item.text} | Link: {url}{item['href']}")

Mi aporte del medio Mileno de México

url = 'https://www.milenio.com/'
milenio = requests.get(url)

soup = bs4.BeautifulSoup(milenio.text, 'html.parser')
article_link = soup.select('.title a') 
links = [ link ['href'] for link in article_link ]

for link in links:
    print(f'{url}{link}')
<import requests 
response = requests.get('https://seguimiento.co/')
import bs4
soup = bs4.BeautifulSoup(response.text, 'html.parser')
links = soup.select('.section')
books = [book.a['href'] for book in links]
for book in books:
    print(book)> 

Use un periódico local. Este es mi código.

import requests
import bs4

#Obteniendo el documento HTML
url = 'https://www.debate.com.mx/'
response = requests.get(url)

#Usando beautiful soup para parsear el documento HTML
soup = bs4.BeautifulSoup(response.text, 'html.parser')

#Obteniendo las URL
url_news = soup.find_all("h2", class_="news__title")

#Imprimiendo las URLs
for url in url_news:
  print(url.find("a")['href'])

Para el periódico mexicano Reforma:

response = requests.get('https://www.reforma.com/')

if response.status_code == 200:
	soup = bs4.BeautifulSoup(response.text, 'html.parser')
	
	URL_NAME = response.url
	news = soup.select('h1 a[class = ligaonclick]')
	
	for new in news:
		print(f'Titulo: {new.text}')
		print(f'Enlace: {URL_NAME}{new["href"]}\n')
	
	

The way i could to see the links in the universe newspaper page.

UNVERSE_LINK = "https://www.eluniverso.com/"
universe_get = requests.get(UNVERSE_LINK)
universe_bs4 = bs4.BeautifulSoup(universe_get.text, "html.parser")
universe_selector = universe_bs4.select(".feed li a")
new_list = [universe["href"] for universe in universe_selector]
for x in new_list:
    print(x)
import requests
import bs4

URL_AMBITO = 'https://www.ambito.com/'

response = requests.get(URL_AMBITO)

soup = bs4.BeautifulSoup(response.text,'html.parser')
titulos_links = soup.select('.title a')
titulos  =[titulo['href'] for titulo in titulos_links]

for titulo in titulos:
    try:
        res = requests.get(titulo)
        sp = bs4.BeautifulSoup(res.text, 'html.parser')
        news_title = sp.select('.detail-header-wrapper h1')
        summary = sp.select('.detail-header-wrapper h2')
        print('-'*25)
        print(news_title[0].text)
        print('\n')
        print(summary[0].text)
        print('\n')
        print('-'*25)
    except IndexError as ie:
        print(ie)
        print('\n')

Hola a todos, comparto mi c√≥digo. En este caso analic√© la p√°gina del CNN en espa√Īol. En este caso pude obtener la secci√≥n de la noticia, el t√≠tulo y su url que despu√©s la divid√≠ en dominio y path para tener un mejor an√°lisis.

import bs4
import requests
import pandas as pd
from urllib.parse import urlparse

response = requests.get('https://cnnespanol.cnn.com')


soup = bs4.BeautifulSoup(response.text,'html.parser')
news = soup.select('.news__data')

def _obtain_data(news):
    section=[]
    title=[]
    domain=[]
    path=[]
    for new in news:
        section.append(news[1].span.a['title'])
        title.append(news[1].h2.a['title'])
        domain.append(urlparse(news[1].h2.a['href']).netloc)
        path.append(urlparse(news[1].h2.a['href']).path)
    return pd.DataFrame({'section':section,'title':title,'domain':domain,'path':path})


df=_obtain_data(news)

df.head()

Este es el resultado y espero que les sirva ūüėĀ

Me costó un poco obtener los títulos y los enlaces. Entiendo el concepto que es sencillo, pero al momento de aplicarlo no sale como lo quiero. Muchas gracias a todos por compartir sus operaciones, me ayudaron a entenderlo mejor.

.

from typing import Text
import bs4
import requests

url = 'https://www.sopitas.com/'
response = requests.get(url)
soup = bs4.BeautifulSoup(response.text, 'html.parser')

articles = soup.select('.hentry-meta h2 a')

for links in articles:
    print(f'Título noticia: {links.get_text()}')

hrefs = [link.attrs.get('href') for link in articles]
cantidad_links = len(hrefs)

for href in hrefs:
    print(f'Enlaces: {href}')

Comparto el peque√Īo scrapper a BBC News Mundo:

import requests
import bs4
# Request to bbc
url = 'https://www.bbc.com/mundo'
response = requests.get(url)
# Get the class that contains the titlen news' url
soup = bs4.BeautifulSoup(response.text, 'html.parser')
news = soup.select('.evnt13t1 a')
# 
news_dict = {}

for item in news:
    # Scraping title and links
    title = item.text
    link = url + item['href'][6:]
    # Scraping content per news
    res = requests.get(link)
    sp = bs4.BeautifulSoup(res.text, 'html.parser')
    paragraphs = sp.select('.e57qer20 p')
    content_list = [paragraph.text for paragraph in paragraphs]
    separator = '\n'
    content = separator.join(content_list)
    # To a dict
    news_dict[title] = (content,news_link)

solo para comprobar

len(news_dict.keys()) == len(news)

Si quieres ver si tu CSS selector si atrae algo ve a F12 y despu√©s dale Ctrl+F para abrir un peque√Īo panel en donde puedes escribir la expresi√≥n y ver que te arroja

Corrigo el código anterior

import requests
import bs4

url ='https://www.elcomercio.com/'

response=requests.get(url)

soup = bs4.BeautifulSoup(response.text, 'html.parser')

news = soup.select('.page-link')
items = [item['href'] for item in news ]

for new in news:
    print(f'titulo: {new.text} | link:{url}{new["href"]}')

De esta manera pude extraer el texto del artículo citado.

import requests
import bs4
response = requests.get('https://www.eluniversal.com.co/farandula/fallece-el-dj-y-productor-musical-creador-del-sonido-chill-out-DY3670630')
soup = bs4.BeautifulSoup(response.text,'html.parser')
texto = soup.select('.paragraph')
print(texto)




Qu√© pasa cuando el contenido de la p√°gina es cargado din√°micamente? Es decir, si la p√°gina carga y en ese momento hay alg√ļn JS por ejemplo, encargado de buscar las noticias o informaci√≥n y ‚Äėpinta‚Äô la p√°gina en ese momento?
Beautiful soup no podría encontrar los elementos. Qué se hace en ese caso?
Vi por internet que utilizan la librería selenium. Es esta la mejor opción?

Saludos ‚ėļ

C√≥digo para el Comercio en Per√ļ

import bs4
import requests

response = requests.get('https://elcomercio.pe')
soup = bs4.BeautifulSoup(response.text,'html.parser')

# get links
links = soup.select('.flow-title a')
hrefs  = [ link.attrs.get('href') for link in links ] 
cantidad_de_links = len(hrefs)

for href in hrefs:
    print(href)

obteniendo los titulos con negrilla de una noticia específica

import bs4
import requests
response = requests.get('https://www.eluniversal.com.mx/metropoli/cdmx/reportan-20-muertes-por-influenza-ah1n1-en-cdmx')
soup = bs4.BeautifulSoup(response.text, 'html.parser')

header = soup.select('.field-name-body strong')


for el in header:
    print(el)```

Obtengo todos los links de noticias de la pagina principal, y luego hago un request a cada link obteniendo asi el titulo de cada noticia y todos los parrafos de cada noticia.

response3 = requests.get('https://impactolocal.com.ar')
soup3 = bs4.BeautifulSoup(response3.text,'html.parser')
news_elems = soup3.select('.entry-title a')
news_links = [news_elem['href'] for news_elem in news_elems]
news_texts = [requests.get(news_link).text for news_link in news_links]
news = []
for news_text in news_texts:
    news_soup = bs4.BeautifulSoup(news_text,'html.parser')
    title = news_soup.select('.td-post-title h1')[0].text
    body = [p.text for p in news_soup.select('.td-post-content p')]
    news.append({title:body})
news

Buen día comunidad, tengo un problema por favor su ayuda con scraping a la siguiente página:
https://www.igepn.edu.ec/ultimos-sismos
Lo que deseo es extraer la tabla de los sismos, pero no la he podido conseguir, ser√° porque es otro contenedor??)

Links de la pagina del tiempo

import requests,bs4

response = requests.request("GET", 'https://www.eltiempo.com')
resultado = response.text

soup = bs4.BeautifulSoup(resultado,'html.parser')

links = soup.select('.title-container a')
hrefs  = [link.attrs.get('href') for link in links ] 
total_de_links = len(hrefs)

for href in hrefs:
    print(href)

Aqui esta mi codigo que extrae los v√≠nculos de el peri√≥dico EL PA√ćS

import bs4
import requests

response = requests.get("https://elpais.com/elpais/portada_america.html")
soup = bs4.BeautifulSoup(response.text,'html.parser')

news = soup.select(".articulo-titulo a")
news_link = [link["href"] for link in news]

for link in news_link:
    print(link)

print(response.status_code)```

Obtener titulo y url

import bs4
import requests

path = 'https://www.eluniversal.com.mx'
response = requests.get(path)
soup = bs4.BeautifulSoup(response.text,'html.parser')

# Tags links
tags = soup.select('.field-content a')

for tag in tags:
    if tag.attrs.get('href'):
        # Title
        print(tag.contents[0])
        # Url
        print((path if tag.attrs.get('href')[0] == '/' else '') +tag.attrs.get('href'))
        print("--------------------------")
import requests
import bs4

main_url='https://www.elespectador.com/'

response = requests.get(main_url, user_agent)
user_agent = {'User-Agent' : 'Mozilla/5.0'}
response = requests.get('https://www.elespectador.com/', user_agent)

soup = bs4.BeautifulSoup(response.text, 'html.parser')

news_links = soup.select('.node-title a')
news_urls = [news["href"] for news in news_links]

for news_url in news_urls: 
    response_news = requests.get(main_url+news_url, user_agent)
    soup_news = bs4.BeautifulSoup(response_news.text, 'html.parser')
    news_comp = soup_news.select('.node-title > h1')    
    title_news = [news.text for news in news_comp]
    if len(title_news)>0:
        print(title_news[0])

Puedes agarrar directamente el h1… una pagina solo deberia tener un solo h1 igualmente, dificil te equivocas xd

Titulos y Links

import requests
import bs4
url='https://www.theclinic.cl/'
response = requests.get(url)
soup = bs4.BeautifulSoup(response.text,'html.parser')

tagsLinks = soup.select('.nota a')

for tagLink in tagsLinks:
    if tagLink.attrs.get('href'):
        print('Titulo: '+tagLink.contents[0])#titulos
        print('Links: '+tagLink.attrs.get('href'))#links
        print('_______________________________________')
import pandas as pd
import bs4
import requests
response = requests.get('https://hipertextual.com/')
soup = bs4.BeautifulSoup(response.text, 'html.parser')
destacados = soup.select(".wrapperDestacados div ")
links= [destacado.select('a')[0]['href'] for destacado in destacados]
print(links)

sin duda saber tecnologias web sea html css y javascript, es una gran ventaja para aprender web scrapping

Para quien le interese. se puede trabajar con bs4 tambien sin hacer uso de selectores:

from bs4 import BeautifulSoup as soup
import requests, lxml

data_soup = soup(requests.get('cualquier url').content, 'lxml')
#
# results = data_soup.findAll('nombre de la etiqueta',{'atributo1':'valor', ...'atributoN':'valorN'})
# esto permite encontrar todas las etiquetas que tengan un atributo dado
# por ejemplo, si quiero encontrar una etiqueta 'div' que tenga la clase 'main-content'
# usaria el siguiente codigo:

results = data_soup.findAll('div',{'class':'main-content'})

#
# si se quiere buscar un tag que tenga varias clases, se puede usar una lista, tal que: 
# data_soup.findAll('div',{'class':['className1','className2',....'classNameN']})```
import bs4
import requests

response = requests.get("https://www.animalpolitico.com/")
soup = bs4.BeautifulSoup(response.text, "html.parser")

headers = soup.select(".ap_home_main_note_main_box_title, .ap_secondary_note_data_title, \
                        div.ap_home_extra_data div.ap_home_extra_data_title")

titles = [title.string for title in headers]
links = [title.select("href") for title in headers]

for title in titles:
    if title:
        print("-" + title[1:] + "\n")
      

Para https://www.cronica.com.ar/

Le agregue una validación para que solo encuentre los links que comiencen con https

import bs4
import re

response = requests.get('https://www.cronica.com.ar/')
soup =bs4.BeautifulSoup(response.text,'html.parser')

print(soup.title.text)

diario_links = soup.select('.cover-link')

#crea una validacion para que solo tome informacion que comience con 'https://'
validacion =re.compile('https://')
links = [link['href'] for link in diario_links if validacion.match(link['href']) ]
print(links)

for link in links:
  print (link)

Algo simple jaja

import bs4

soup = bs4.BeautifulSoup(response.text, 'html.parser')

courses_links = soup.select('.title a')
courses = [course['href'] for course in courses_links]

for course in courses:
    print(course)```

Esta es mi solución para extraer los titulares del el periódico ElPais junto con sus mini descripciones.

import requests
import bs4

response = requests.get('https://elpais.com/tecnologia/')
soup = bs4.BeautifulSoup(response.text, 'html.parser')

data_titles = soup.select('.articulo-titulo')
titles = [title.text for title in data_titles]

data_descriptions = soup.select('.articulo-entradilla')
descriptions = [description.text for description in data_descriptions]

title_description = {title: description for title, description in zip(titles, descriptions)}

for news in title_description:
    print('{} \n\t {}'.format(news, title_description.get(news)))```

Diario ElHeraldo.
Se obtiene todos los links relacionados con t√≠tulos y noticias en general. ūüėÉ

heraldo = requests.get("https://www.elheraldo.co/")
soup   = bs4.BeautifulSoup(heraldo.text, 'html.parser')

links_with_text = [link['href'] for link in soup.find_all("a", href=True) if link.text]

print( links_with_text  )

Este es mi código para el diario Espectador:

import requests
import bs4

url = "https://www.elespectador.com/"

response = requests.get(url)

soup = bs4.BeautifulSoup(response.text, 'html.parser')
news = soup.select(".Card-title a")

all_links_news = []

for item in news:
    print(f"Noticia:{item.text} | Link: {url}{item['href']}")
    all_links_news.append(url + item["href"])

parrafo_list = []
dic_parrafo  = {}

for link_new in all_links_news:
    articulo_requests = requests.get(link_new)
    soup_articulo = bs4.BeautifulSoup(articulo_requests.text, "html.parser")

    try:
        titulo = soup_articulo.select(".Article-TitleSection h1")[0].text  
        #print(titulo)
        parrafos_Body =  soup_articulo.select(".Article-Content p")


        for parrafo in parrafos_Body:
            parrafo_list.append(parrafo.text)
        dic_parrafo  = {titulo : parrafo_list}
        parrafo_list = []
            
    except:
        print("No se pudo acceder a {}".format(titulo))
        
        
print(dic_parrafo)
import bs4
import requests

url = 'https://elcomercio.pe'
response = requests.get(url)
soup = bs4.BeautifulSoup(response.text, 'html.parser')

news = soup.select('.page-link')

for item in news:
    print(item.contents[0] + ' -> ' + url + item.attrs.get('href'))

Aqui realice un poco de web scrapping a lapagina de El Siglo de venezuela:

response_siglo = requests.get('https://elsiglo.com.ve/')
siglo_soup = bs4.BeautifulSoup(response_siglo.text, 'html.parser')

noticias_destacadas_titulo = siglo_soup.select('.td-block-span12 .td_module_10 .item-details a')
noticias_destacadas_texto = siglo_soup.select('.td-block-span12 .td_module_10 .item-details .td-excerpt')

titulos = [ titulo['title'] for titulo in noticias_destacadas_titulo]
textos = [ texto.text for texto in noticias_destacadas_texto]

for i in range(len(titulos)) :
    print(titulos[i])
    print(textos[i])
    print('******************************************************************************\n')

El Financiero generaba un response 403 y lo implemente de la siguiente manera:

<import requests
import bs4
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
response = requests.get('https://elfinanciero.com.mx/', headers=headers)
soup = bs4.BeautifulSoup(response.text, 'html.parser')
divs_a = soup.select('.column .is-12 a')
notas_links = [nota['href'] for nota in divs_a]>

me costo un poco pero lo logre…

Mi solucion

import requests
import bs4
url = 'https://www.eltiempo.com/'
response = requests.get(url)
soup = bs4.BeautifulSoup(response.text,'html.parser')
noticias = soup.find_all("a", class_="title page-link")
lista_llena_noticias = [noticia['href'] for noticia in noticias]
for noti in lista_llena_noticias:
    print(noti)

Me decidi por noticias de WOW :

import requests
response = requests.get('https://worldofwarcraft.com/en-us/news')
print(dir(response))
import bs4

soup = bs4.BeautifulSoup(response.text, 'html.parser')

links_news = soup.select('.NewsBlog-content a')

links = [link['href'] for link in links_news]

for link in links:
    print(link)

Principales noticias de el tiempo

import bs4
import requests

response2 =requests.get("https://www.eltiempo.com")

soup2 = bs4.BeautifulSoup(response2.text,"html.parser")

titulares_noticias= soup2.select(".article-details>.title-container")
epigrafo_noticias= soup2.select(".article-details>.epigraph-container")
enlaces_noticias= soup2.select(".article-details>.title-container>a")

titulares=[]
for i in range(len(titulares_noticias)-1):
    titulares.append(titulares_noticias[i].get_text())  #T itulares solo texto

enlaces = [enlace["href"] for enlace in enlaces_noticias]  #Enlace solo texto (algunos se repiten cuando tienen videos)
enlaces=list(dict.fromkeys(enlaces))  #Enlace solo texto sin repetir 

print("===============")    
for i in range(len(enlaces)-1):
    print("Noticia {}".format(i+1))
    print(titulares[i])
    print("https://www.eltiempo.com{}".format(enlaces[i]))
    print("===============")```

Titulares + links. me falto los textos de las noticias.

import bs4
import requests

response = requests.get("https://nuevodia.com.ve/")

soup = bs4.BeautifulSoup(response.text, 'html.parser')

noticias = soup.select('.thumb-title > a')

links = []
title = []
contador = 0
for articulo in range(len(noticias)):
    links.append(noticias[articulo]['href'])
    title.append(noticias[articulo].get_text())
    contador = contador + 1

for i in range(contador):
    print('Titular: {} | Link:{}'.format(title[i], links[i]))```

Les dejo mi versión del código donde está más simplificado el análisis web. Además cambio la función get() por get_text()

import requests
import bs4

response_LaVozDelInterior = requests.get('https://www.lavoz.com.ar/')
soup_LaVozDelInterior = bs4.BeautifulSoup(response_LaVozDelInterior.text, 'html.parser')

for iterador in soup_LaVozDelInterior.find_all('a'):
    print(iterador.get_text())

Mi version con infobae.com

import requests
import bs4

respuesta = requests.get(‚Äėhttps://www.infobae.com/‚Äô)

parsear = bs4.BeautifulSoup(respuesta.text,‚Äėhtml.parser‚Äô)

links = parsear.select(’.headline normal normal-style a’)

links_href = [link[‚Äėhref‚Äô] for link in links]

for link in links_href:

print(link)

Me cost√≥ un poco pero lo logr√©, gracias a los compa√Īeros que compartieron sus soluciones me pude guiar. Scrapping de zonacero.com, un periodico de mi ciudad.

Resultado:

Código:

import bs4
import requests

try:
    url = 'http://zonacero.com/'
    response = requests.get(url)
    response.encoding = 'utf-8'
        
    soup = bs4.BeautifulSoup(response.text, 'html.parser')
    
    # print(soup.prettify())

    links = soup.select('.title a')
        
    news = ['http://zonacero.com'+link['href'] for link in links]
    
    articles= []
    
    for num, new in enumerate(news, start=1):

        response = requests.get(new)
        soup = bs4.BeautifulSoup(response.text, 'html.parser')
        
        if soup.select(".body .top .title"):
            
            title = soup.select(".body .top .title")[0].text
            articles.append(str(num) + ")" + title + " - " + new)
    
    
    for article in articles:
        print(article)
    
except requests.exceptions.RequestException as e:
        print ("Error de conexión :( ",e) ```



import requests

mediotiempo_request = requests.get('https://www.mediotiempo.com/')

soup_mediotiempo = bs4.BeautifulSoup(mediotiempo_request.text, 'html.parser')

links_mediotiempo = soup_mediotiempo.select('.title a')

links = [link['href'] for link in links_mediotiempo]

for link in links:
    print(link)

Les dejo mi aporte para rosario3

import bs4
import requests

response = requests.get('https://www.rosario3.com/')
soup =bs4.BeautifulSoup(response.text,'html.parser')

print(soup.title.text)

diario_links = soup.select('.cover-link')

links = [link['href'] for link in diario_links]
titles = [title['title'] for title in diario_links]

numero_de_titulo = 0

for link in links:
    print(titles[numero_de_titulo])
    print(f'https://www.rosario3.com/{link}')
    print()
    numero_de_titulo = numero_de_titulo + 1

interesante!

Intente por mas de 6 horas con la pagina del periodico local y no pude (https://www.eluniversal.com.co/). SI alguno puede ayudarme a como identificar, se los agradezco.

Excelente clase
segui los pasos y claro que hay cambios en la estructura a diferencia de la del profesor

Guardar en un diccionario el titulo y el contenido de las noticias de el tiempo colombia

content = {}
content.clear()
for news,i in zip(today_news, range(len(today_news))):
    response = requests.get('https://www.eltiempo.com' + news)
    soup = bs4.BeautifulSoup(response.text,'html.parser')
    news_title = soup.select('.titulo-principal-bk h1')
    news_content = soup.select('.articulo-contenido p')
    content.update({
       "Titulo_"+ str(i) : news_title, 
       "Contenido_"+ str(i): news_content
    })
import bs4
import requests

response = requests.get('https://eldeber.com.bo/')
soup =bs4.BeautifulSoup(response.text,'html.parser')

print(soup.title.text)

diario_links = soup.select('.nota-link')

links = [link['href'] for link in diario_links]
titulo = [titulo.text.strip() for titulo in soup.findAll(attrs={'class' : 'nota-link'})]
            
i = 0
for link in links:
    print(titulo[i])
    print(f'https://eldeber.com.bo/{link}')
    print()
    i += 1
        

P√°gina: https://www.eurogamer.es/
Código:

import requests
import bs4

response = requests.get('https://www.eurogamer.es/')
soup = bs4.BeautifulSoup(response.text, 'html.parser')

articles = soup.select('.list-item a')

base_url = 'https://www.eurogamer.es'
articles_urls = set([article['href'] for article in articles])

for url in articles_urls:
    article_response = requests.get(f"{base_url}{url}")
    soup2 = bs4.BeautifulSoup(article_response.text)
    titles = soup2.select('.article h1')
    descriptions = soup2.select('.body section:last-child')
    title = titles[0].get_text()
    description_text = descriptions[0].get_text()
    descp_resume = description_text
    print(f'Titulo: {title}')
    print(f'Descripcion: {descp_resume}')

ha cambiado un poco la forma de manejar las clases y etiquetas en el universal de México desde que se hizo este curso. Acá mi solución, solo imprime los titulares más grandes.

import request 
import bs4

response = requests.get('https://www.eluniversal.com.mx/')
soup = bs4.BeautifulSoup(response.text, 'html.parser')
title = soup.select('.ce6-Tipo1_Titulo a')

titles = [title['href'] for title in title]
for i in titles:
    print(i)

al día de hoy 29/09/2020 me imprime los siguientes links de titulares


https://www.eluniversal.com.mx/nacion/coronavirus-29-de-septiembre-mexico-suma-738-mil-casos-de-covid-y-77-mil-muertes
https://www.eluniversal.com.mx/cartera/ante-reestructura-de-creditos-abm-recomienda-seguir-pagando-y-evitar-quitas
https://www.eluniversal.com.mx/estados/lord-pizza-da-su-version-tras-video-no-me-deje-y-tambien-me-pegaron
https://www.eluniversal.com.mx/espectaculos/los-motivos-de-kalimba-para-terminar-con-aislinn-derbez```

Yo use Expresiones regulares para poder filtrar las rutas bien

import requests
import bs4
import re

pagina = 'https://www.platzi.com'
respond = requests.get(pagina)
soup = bs4.BeautifulSoup(respond.text, 'html.parser')

resent_courses_unfilter = soup.select('.NextReleases-card a')

for course in resent_courses_unfilter:
    print(f'{course}')
    match = re.findall('/.*"', str(course))
    match1 = re.findall('s/.+', match[0][:-1])
    print(f'\tRuta:   {pagina}{match[0][:-1]}')
    print( '\tCurso:  {}\n'.format(match1[0][2:].replace('-', ' ')))

<a href="/cursos/gestion-cambio"></a>
        Ruta:   https://www.platzi.com/cursos/gestion-cambio
        Curso:  gestion cambio

<a href="/cursos/python-lenguaje-natural"></a>
        Ruta:   https://www.platzi.com/cursos/python-lenguaje-natural
        Curso:  python lenguaje natural

<a href="/cursos/periodismo-movil"></a>
        Ruta:   https://www.platzi.com/cursos/periodismo-movil
        Curso:  periodismo movil

Periódico El Peruano

Me costo demasiado entender esta parte por querer hacer scrapping en https://edition.cnn.com pero al final lo hice de otra pagina. Alguien sabe como hacer scrapping en cnn?

He aquí el desarrollo de mi ejercicio con el periodico digital: elpais.com ------>

import bs4
import requests

try:
    url = 'https://www.elpais.com'
    response = requests.get(url)

    soup = bs4.BeautifulSoup(response.text, 'html.parser')

    elpais_links = soup.select('.headline')

    elpaiss = [elpais.a['href'] for elpais in elpais_links]

    for elpais in elpaiss:
        cadena_comp = elpais

        cadena_enc_num = cadena_comp.find("digital")
        if cadena_enc_num != -1:
            cadena_enc = elpais

    https_comp = cadena_enc
    https_enc_num = https_comp.find("https://")
    if https_enc_num == -1:
        url2 = url + cadena_enc
    else:
        url2 = cadena_enc

    response2 = requests.get(url2)

    soup2 = bs4.BeautifulSoup(response2.text, 'html.parser')
    article_title = soup2.title
    print(article_title)
    h2 = soup2.find_all("h2")
    p = soup2.find_all("p")
    print(h2)
    print(p)
    
except requests.exceptions.RequestException as e:
        print ("Oooooppppssss: Something else happened to the try to connect with the page: ",e)```

Gracias por sus ense√Īanzas..... :) 

https://www.eluniversal.com.co/

import bs4
import requests

host = "https://www.eluniversal.com.co/"

response = requests.get(host)

soup = bs4.BeautifulSoup(response.text, 'html.parser')

newsTitles = soup.select(".priority-content")

newsLinks= []

for newLink in newsTitles:
    link=newLink.parent.parent.a
    if link != None:
        newsLinks.append(link['href'])
newsLinks = newsLinks[1:]

news= []

for newLink in newsLinks:
    response = requests.get(host + newLink)
    soup = bs4.BeautifulSoup(response.text, 'html.parser')
    title = soup.select(".priority-content")[0].text
    paraphs = soup.select(".paragraph p")
    content = [p.text for p in paraphs]
    content = "".join(content)
    news.append((title, content))
news```

Web Scraping periodico eltiempo.com 8-Mayo-2020, capture los titulares de la Home Page.

Fue necesario especificar la codificación utf-8, para que reconociera todos los caracteres.

import requests
import bs4
sitio = requests.get('https://www.eltiempo.com')
sitio.encoding = "utf-8"
soup = bs4.BeautifulSoup(sitio.text, 'html.parser')
titulos = soup.select('.title')
for titulo in titulos:
  print(titulo.text)

Resultado:

Colombia supera los 10 mil contagiados por covid-19; cifra de muertos se eleva a 428
Se levanta pico y género, y otros cambios para Bogotá desde el lunes
Esto debe saber sobre el uso del carro del 11 al 25 de mayo en Bogot√°
Tragedia en Santa Marta: covid-19 acabó con una familia entera
Investigan a funerarias por presuntos cobros irregulares por covid-19
Críticas por suntuosa fiesta de J Balvin en su mansión de Medellín
Edy Fonseca, la celadora que estuvo ‚Äėretenida‚Äô en edificio de Rosales
Así ha logrado el Putumayo mantenerse libre de coronavirus
Bogotá bajó a la mitad su tasa de mortalidad por el nuevo coronavirus
Congresista relacionado con caso de celadora explicó lo que pasó
etc…

Se hizo con la revista semana

import requests
import bs4
sitio = requests.get('https://www.semana.com/')
soup = bs4.BeautifulSoup(sitio.text, 'html.parser')
titulos = soup.select('.article')
for titulo in titulos:
  print(titulo.text)```
import requests

response = requests.get('https://www.elheraldo.co/')

import bs4

soup = bs4.BeautifulSoup(response.text, 'html.parser')

titles_news = soup.select('.titulo a')
titles = ['https://www.elheraldo.co/'+title['href'] for title in titles_news]
for title in titles:
    print(title)

El tiempo, de Colombia

response = requests.get('https://www.eltiempo.com/')
print(response.status_code)
soup = bs4.BeautifulSoup(response.text,'html.parser')
print(soup.title.text)
news_links = soup.select('.title-container a')
today_news = [news['href'] for news in news_links]
for news in today_news:
    print(news)

El espectador, Colombia. Se obtuvieron los enlaces de todas las noticias de la página principal y de cada una de ellas se extrajeron los títulos, encabezados, contenido de la noticia y urls de las imágenes, cada uno de los elementos anteriores hacen parte de un diccionario, organizados a su vez en una lista.


import requests
import bs4
from urllib.parse import urljoin

url='https://www.elespectador.com'
resp=requests.get(url)
resp.encoding='utf-8'
soup=bs4.BeautifulSoup(resp.text,'html.parser')
urlA=soup.select(".node-title a")
urls=[urljoin(url,x['href']) for x in urlA ]

reslist=[]
for x in urls:
    x=urls[0]
    temp=requests.get(x)
    temp.encoding='utf-8'
    soup2=bs4.BeautifulSoup(temp.text,'html.parser')
    title=soup2.select(".node-title h1")[0].text
    teaser=soup2.select(".node-teaser p")[0].text
    body=""
    for i in soup2.select(".node-body p"):
        body=body+'\n'+ i.text
    image=soup2.select(".node-image img")[0]['src']
    dic={'url':x,'titulo':title, 'encabezado':teaser,'texto':body,'urlImagen':image}
    reslist.append(dic)
print(reslist)

# ejem, para acceder a cada elemento de la primera noticia:
# print(reslist[0]['url'])
# print(reslist[0]['titulo'])
# print(reslist[0]['encabezado'])
# print(reslist[0]['texto'])
# print(reslist[0]['urlImagen'])

Revista Semana, Colombia

import requests

response = requests.get('https://semana.com')
response.encoding ='utf-8'
print(dir(response))
print(response.text)


import bs4

soup = bs4.BeautifulSoup(response.text, 'html.parser')

articles = soup.select('.article')

for article in articles:
  print(article)