Spaces:
Runtime error
Runtime error
import streamlit as st | |
from PIL import Image | |
from bs4 import BeautifulSoup as soup | |
from urllib.request import urlopen | |
from newspaper import Article | |
import io | |
import nltk | |
nltk.download('punkt') | |
st.set_page_config(page_title='NewsAgora🇧🇷: Um Portal de Notícias Resumidas📰', page_icon='./Meta/newspaper.ico') | |
def fetch_news_search_topic(topic): | |
site = 'https://news.google.com/rss?hl=pt-BR&gl=BR&ceid=BR:pt'.format(topic) | |
op = urlopen(site) # Open that site | |
rd = op.read() # read data from site | |
op.close() # close the object | |
sp_page = soup(rd, 'xml') # scrapping data from site | |
news_list = sp_page.find_all('item') # finding news | |
return news_list | |
def fetch_top_news(): | |
site = 'https://news.google.com/rss?hl=pt-BR&gl=BR&ceid=BR:pt' | |
op = urlopen(site) # Open that site | |
rd = op.read() # read data from site | |
op.close() # close the object | |
sp_page = soup(rd, 'xml') # scrapping data from site | |
news_list = sp_page.find_all('item') # finding news | |
return news_list | |
def fetch_category_news(topic): | |
site = 'https://news.google.com/news/rss/headlines/section/topic/{}?hl=pt-BR&gl=BR&ceid=BR:pt'.format(topic) | |
op = urlopen(site) # Open that site | |
rd = op.read() # read data from site | |
op.close() # close the object | |
sp_page = soup(rd, 'xml') # scrapping data from site | |
news_list = sp_page.find_all('item') # finding news | |
return news_list | |
def fetch_news_poster(poster_link): | |
try: | |
u = urlopen(poster_link) | |
raw_data = u.read() | |
image = Image.open(io.BytesIO(raw_data)) | |
st.image(image, use_column_width=True) | |
except: | |
image = Image.open('no_image.jpg') | |
st.image(image, use_column_width=True) | |
def display_news(list_of_news, news_quantity): | |
c = 0 | |
for news in list_of_news: | |
c += 1 | |
# st.markdown(f"({c})[ {news.title.text}]({news.link.text})") | |
st.write('**({}) {}**'.format(c, news.title.text)) | |
news_data = Article(news.link.text) | |
try: | |
news_data.download() | |
news_data.parse() | |
news_data.nlp() | |
except Exception as e: | |
st.error(e) | |
fetch_news_poster(news_data.top_image) | |
with st.expander(news.title.text): | |
st.markdown( | |
'''<h6 style='text-align: justify;'>{}"</h6>'''.format(news_data.summary), | |
unsafe_allow_html=True) | |
st.markdown("[Read more at {}...]({})".format(news.source.text, news.link.text)) | |
st.success("Published Date: " + news.pubDate.text) | |
if c >= news_quantity: | |
break | |
def run(): | |
st.title("NewsAgora🇧🇷: Um Portal de Notícias Resumidas📰") | |
image = Image.open('newspaper.png') | |
col1, col2, col3 = st.columns([3, 5, 3]) | |
with col1: | |
st.write("") | |
with col2: | |
st.image(image, use_column_width=False) | |
with col3: | |
st.write("") | |
category = ['--Selecione--', 'Notícias em Alta🔥', 'Tópicos Favoritos💙', 'Buscar Tópico🔍'] | |
cat_op = st.selectbox('Selecione a categoria', category) | |
if cat_op == category[0]: | |
st.warning('Por favor, selecione uma opção!') | |
elif cat_op == category[1]: | |
st.subheader("✅ Aqui estão as notícias em alta para você") | |
no_of_news = st.slider('Número de notícias:', min_value=5, max_value=15, step=1) | |
news_list = fetch_top_news() | |
display_news(news_list, no_of_news) | |
elif cat_op == category[2]: | |
av_topics = ['Choose Topic', 'WORLD', 'NATION', 'BUSINESS', 'TECHNOLOGY', 'ENTERTAINMENT', 'SPORTS', 'SCIENCE', | |
'HEALTH'] | |
st.subheader("Escolha seu tópico favorito") | |
chosen_topic = st.selectbox("Escolha seu tópico favorito", av_topics) | |
if chosen_topic == av_topics[0]: | |
st.warning("Por favor, escolha um tópico") | |
else: | |
no_of_news = st.slider('Número de notícias:', min_value=5, max_value=15, step=1) | |
news_list = fetch_category_news(chosen_topic) | |
if news_list: | |
st.subheader("✅ Aqui estão algumas notícias de {} para você".format(chosen_topic)) | |
display_news(news_list, no_of_news) | |
else: | |
st.error("Nenhuma notícia encontrada para {}".format(chosen_topic)) | |
elif cat_op == category[3]: | |
user_topic = st.text_input("Digite seu tópico🔍") | |
no_of_news = st.slider('Número de notícias:', min_value=5, max_value=15, step=1) | |
if st.button("Search") and user_topic != '': | |
user_topic_pr = user_topic.replace(' ', '') | |
news_list = fetch_news_search_topic(topic=user_topic_pr) | |
if news_list: | |
st.subheader("✅ Aqui estão algumas notícias de {} para você".format(user_topic.capitalize())) | |
display_news(news_list, no_of_news) | |
else: | |
st.error("Nenhuma notícia encontrada para {}".format(user_topic)) | |
else: | |
st.warning("Por favor, escreva o nome do tópico para pesquisar🔍") | |
run() |