0
respostas

Erro na mudança de uma classe para outra

Boa noite,

Estou tentando fazer raspagem de dados com o seguinte código:

import requests as rq
import json
import pandas as pd
from bs4 import BeautifulSoup as bs

url='http://web.archive.org/cdx/search/cdx?url=economia.uol.com.br&collapse=digest&from=20201001&to=20201002&output=json'

urls=rq.get(url).text 

parse_url=json.loads(urls) # formatando as informações em um formato do tipo json

parse_url[1][1]

waylink=parse_url[1][1]+'/'+ parse_url[1][2]

url_final='https://web.archive.org/web/'+waylink 

url_list=[]
final_url_list=[]

for i in range(1,len(parse_url)): 
  tstamp=parse_url[i][1] 
  orig_url=parse_url[i][2] 
  waylink=tstamp+'/'+orig_url
  url_list.append(waylink)


for url in url_list:
  final_url_list.append('https://web.archive.org/web/'+url)

lista_de_urls_finais[0]     

req=rq.get(final_url_list[0]).text 

soup=bs(req,'html.parser') 

soup.find_all('h2', 'thumb-title')
soup.find_all('h2', 'thumb-title')[0].get_text() 
soup.find_all('div',attrs='thumbnail-standard-wrapper')[0].find_all('a', attrs={"data-audience-click":'{"reference":"abrir-chamada","component":"highlights-with-photo","mediaName":"Home"}'}) 

for link in soup.find_all('div',attrs='thumbnail-standard-wrapper')[0].find_all('a', attrs={"data-audience-click":'{"reference":"abrir-chamada","component":"highlights-with-photo","mediaName":"Home"}'}):
  print (link.get('href'))

n_noticias=len(soup.find_all('div',attrs='thumbnail-standard-wrapper'))  

lista_links=[]
for noticia in range(n_noticias):
  for link in soup.find_all('div',attrs='thumbnail-standard-wrapper')[noticia].find_all('a', attrs={"data-audience-click":'{"reference":"abrir-chamada","component":"highlights-with-photo","mediaName":"Home"}'}):
    lista_links.append(link.get('href')) 

noticia={}
noticias=[]

for n in range(n_noticias): 
  noticia['título']=soup.find_all('h2', 'thumb-title')[n].get_text() 
  noticia['link']=lista_links[n] 
  noticias.append(noticia)
  noticia={} 



url='https://web.archive.org/web/20201002163105/https://economia.uol.com.br/empregos-e-carreiras/noticias/redacao/2020/09/30/pnad-continua-ibge-desemprego.htm'
req=rq.get(url).text
soup=bs(req,'html.parser')
soup.find('div', attrs={'class':'text has-image '}).get_text()

def captura_noticia(url):
  req=rq.get(url).text
  soup=bs(req,'html.parser')
  texto_noticia=soup.find('div', attrs={'text has-image '})
  if texto_noticia==None:
    texto_noticia='Página não capturada'
  elif texto_noticia!=None:
     texto_noticia=soup.find('div', attrs={'text has-image '}).get_text()
  return texto_noticia


noticia={}
noticias=[]
lista_links=[]

for url in final_url_list:
    req=rq.get(url).text
    soup=bs(req,'html.parser')
    n_noticias=len(soup.find_all('div',attrs='thumbnail-standard-wrapper'))
    for n in range(n_noticias):
        for link in soup.find_all('div',attrs='thumbnail-standard-wrapper')[n].find_all('a', attrs={"data-audience-click":'{"reference":"abrir-chamada","component":"highlights-with-photo","mediaName":"Home"}'}):
           lista_links.append(link.get('href')) 
    for n in range(n_noticias):
        noticia['titulo']=soup.find_all('h2', attrs='thumb-title')[n].get_text()
        noticia['link']=lista_links[n]
        noticia['texto_noticia']=captura_noticia(lista_links[n])
        noticias.append(noticia)
        noticia={}

    lista_links=[]

noticias

tabela=pd.DataFrame(data=noticias)

tabela.to_excel("Tabela de Noticias Teste.xls")

O script faz a extração, mas alguns sites ele não consegue extrair. Fui abrindo e inspecionando alguns sites que ele não conseguiu abrir e vi que a class relacionada ao texto da notícia não é 'text has-image ', mas 'c-news__body' ou 'text '.

Exemplos:

https://economia.uol.com.br/noticias/redacao/2020/09/30/bolsa-fecha-em-alta.htm https://www1.folha.uol.com.br/mercado/2020/09/nova-cpmf-de-guedes-trava-e-congresso-deve-derrubar-desoneracao-da-folha.shtml

Desse modo, eu tentei alterar o código, para modificar esses parâmetros, desse modo:

url='https://web.archive.org/web/20201002163105/https://economia.uol.com.br/empregos-e-carreiras/noticias/redacao/2020/09/30/pnad-continua-ibge-desemprego.htm'
req=rq.get(url).text
soup=bs(req,'html.parser')
soup.find('div', attrs={'class':'c-news__body'}).get_text()

def captura_noticia(url):
  req=rq.get(url).text
  soup=bs(req,'html.parser')
  texto_noticia=soup.find('div', attrs={'c-news__body'})
  if texto_noticia==None:
    texto_noticia='Página não capturada'
  elif texto_noticia!=None:
     texto_noticia=soup.find('div', attrs={'c-news__body'}).get_text()
  return texto_noticia

obs: fiz a mesma coisa alterando para 'text '.

Porém, nos dois casos dá o mesmo erro: 'NoneType' object has no attribute 'get_text'

Alguém pode me ajudar por favor?

Muito obrigada