Web scraping on a specific url with BeautifulSoup

1
from bs4 import BeautifulSoup
import requests
import re
url = 'http://www.bhaktiyogapura.com/2017/03/calendario-vaisnava-marco-de-2017/'
header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                        'AppleWebKit/537.36 (KHTML, like Gecko) '
                        'Chrome/51.0.2704.103 Safari/537.36'}



req = requests.get(url,headers= header)

html = req.text

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

date = "23 Março 2017- "
for strong in soup.findAll("strong"):
    print (strong.get_text())
    for string in soup.findAll("p", {"class": "event"}):
        print(string.get_text())

I'm trying to extract information from: link

I would like to print like this:

Dia: 4 Março 2017- Sábado

Evento: Desaparecimento de Śrī Śrīmad Bhakti Vaibhava Purī Gosvāmī Mahārāja

An event is always preceded by "-" such as

-Início Śrī Navadvīpa-dhāma parikramā e Saṇkalpa grāhāna 

March 2017

The code in question is printing everything, that is, it is ignoring the date. I also intend, instead of putting the date in the code, pick the date of the day (in local time) and print the day of that specific day. How to make?  One of the difficulties is that the dates are in Portuguese: 1 March 2017

    
asked by anonymous 11.03.2017 / 13:14

1 answer

2

I hope the code below helps. As the HTML of the page is not very consistent the day of March 27 was not captured ... I left this exception for you to solve because 99% of the work is solved below ...:

import calendar  
import datetime
import locale

from bs4 import BeautifulSoup
import requests    


url = ' http://www.bhaktiyogapura.com/2017/03/calendario-vaisnava-marco-de-2017'
site = requests.get(url)

site_HTML = BeautifulSoup(site.content, 'html.parser')
dados_calendario = site_HTML.find(attrs={"class": "the_content_wrapper"})

def busca_data_do_evento(evento): 
    ''' A datas estão dentro de uma tag strong. Assim sendo, retornamos a primeira 
    tag p que possui strong antes do eventos'''
    data = evento.find_previous_siblings('p')
    for d in data:
        if d.find('strong'):
            return d    

def busca_eventos(calendario):
    ''' Busca todos o eventos do calendário e retorna em uma lista. Enventos são inciados por '-' ou '–' '''
    eventos = [evento for evento in calendario.find_all('p') if evento.text.startswith('-') or evento.text.startswith('–')]
    return eventos

def trata_eventos(eventos):
    ''' Algumas data possuem eventos divididos em mais de uma tag p, vamos tratar 
        estas situações verificando na página se existem dois eventos seguidos, 
        se existirem agrupamos em um único item '''
    def is_evento(tag):
        if tag.text.startswith('-'):
            return True
        else:
            return False

    eventos_tratados = []
    for n, evento in enumerate(eventos):
        proxima_tag = evento.find_next_sibling('p')
        if is_evento(proxima_tag):
            eventos_tratados.append([evento, proxima_tag])
        else:
            foi_tratado = any([evento in evento_tratado for evento_tratado in eventos_tratados])
            if foi_tratado is False:
                eventos_tratados.append([evento])
    return eventos_tratados

eventos = busca_eventos(dados_calendario)
eventos = trata_eventos(eventos)
calendario = [[busca_data_do_evento(e[0]).text, e] for e in eventos] 

''' Neste ponto temos o calendario com as datas e eventos, contudo os eventos ainda contem ainda estao como objetos Beautifulsoup.
Vamos deixar apenas o texto '''
def get_text(evento):
    return evento.text.strip()

for n, data in enumerate(calendario):
    eventos_data = data[1]
    text_eventos = [get_text(e) for e in eventos_data]
    # altera o calendario deixando apenas texto
    calendario[n][1] = text_eventos   

locale.setlocale(locale.LC_ALL, 'Portuguese')
def trata_data(string_data_evento):
    data = string_data_evento.split('-')[0]
    dia, mes, ano = data.split(' ')
    meses = [mes.title() for mes in calendar.month_name]
    mes = str(meses.index(mes))
    data = ''.join([dia, mes, ano])    
    return datetime.datetime.strptime(data, "%d%m%Y").date()

''' Agora vamos tratar as datas e tratar para o formato datetime.date e inseri-las na lista de eventos '''
for n, evento in enumerate(calendario):
    calendario[n].insert(0, trata_data(evento[0]))

''' Finalmente criamos um dicionário para facilitar a busca por data'''
calendario_vaisnava = {}
for evento in calendario:
    calendario_vaisnava[evento[0]] = evento[2][0]

Now let's see how the search was on our calendar, checking for events on 04/03/2017:

dia = datetime.datetime.strptime('04032017', "%d%m%Y").date()
print(calendario_vaisnava[dia])

Result:     - Disappearance of Śrī Śrīmad Bhakti Vaibhava Purī Gosvāmī Mahārāja

IT WORKS !!!

    
16.03.2017 / 17:13