1
resposta

Tag table vazia quando chamada no python. falta a tag tbody

Oi estou testando fazer o scraping em um site de Fundo imobiliario. e quando eu tento puxar tabela com as informaçoes ela vem vazia

https://fiis.com.br/lupa-de-fiis/

from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
from bs4 import BeautifulSoup
url = 'https://fiis.com.br/lupa-de-fiis/'
header = {
  "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
  "X-Requested-With": "XMLHttpRequest"
}
resq = Request(url, headers = header)
response = urlopen(resq)
html = response.read()
soup = BeautifulSoup(html, 'html.parser')
soup.table

saida:

table class="display nowrap" id="filter--result-table" style="width: 100%;"></table

olhando no código do site, falata a tag tbody onde está a tabela com os dados. Não achei uma forma de extrair esses dados.

1 resposta

Oii João, como você está?

Peço desculpas pela demora em obter um retorno.

No site utilizado no curso, por padrão o HTML completo já existe na página, o que facilita a busca por elementos. Porém, no site que você deseja obter a tabela, o HTML é criado de forma dinâmica, ou seja, a árvore de elementos do HTML é criada por meio de algum código javascript conforme utilizamos a página.

Para fazer scraping de páginas que possuem essa característica, apenas a biblioteca ensinada no curso não é suficiente, é necessário utilizar algum recurso mais potente, como a biblioteca Selenium. Infelizmente aqui na Alura não temos cursos que abranjam esse cenário com a linguagem Python, porém, aqui no fórum temos várias respostas que poderão te nortear para alcançar seu objetivo e além disso, também recomendo a leitura da documentação da biblioteca Selenium:

Mas, como aperitivo, deixo abaixo um código que cumpre o objetivo de extrair as informações da tabela:

from selenium import webdriver
import pandas as pd

url = 'https://fiis.com.br/lupa-de-fiis/'

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get(url)
tabela = driver.find_element_by_class_name('dataTables_scroll')
dados = pd.read_html(tabela.get_attribute('innerHTML'))
print(dados)

Deixo como desafio para você entender um pouco mais sobre como o Selenium funciona e também, sobre o exemplo de código acima. Para esse código em específico foi utilizado o navegador Chrome, mas sinta-se a vontade para utilizar outros, desde que baixe o webdriver que foi citado nas referências anteriores.

Abraços e bons estudos!