0

In python3 I want to extract all the text content of a table from a website. But the way the information is organized is not with a conventional table, but with tr, td, and span

The information is on the block "Movimentações" on the screen

The program to start extraction:

import requests
from bs4 import BeautifulSoup
import urllib3; urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

res = requests.get("https://esaj.tjsp.jus.br/cpopg/show.do?processo.codigo=2S000YR9Q0000&processo.foro=100&paginaConsulta=2&conversationId=&dadosConsulta.localPesquisa.cdLocal=100&cbPesquisa=NMPARTE&dadosConsulta.tipoNuProcesso=UNIFICADO&dadosConsulta.valorConsulta=Google&uuidCaptcha=&pbEnviar=Pesquisar", verify=False)

soup = BeautifulSoup(res.content,'lxml')

# I get a numeric code to organize what will be extracted
num_processo = soup.select_one('td:has(>.labelClass:contains("Processo:")) + td').text.strip() if soup.select_one('td:has(>.labelClass:contains("Assunto:")) + td') is not None else 'N/A'

# This is where the table is    
table = soup.find_all("tbody",{"id":"tabelaUltimasMovimentacoes"})

I want to extract just the all text in the rows and organize it like this (example with the first lines):

[{"num_processo": num_processo,
  "text": "22/04/2019       Certidão de Publicação Expedida 
Relação :0130/2019 Data da Disponibilização: 22/04/2019 Data da Publicação: 23/04/2019 Número do Diário: 2792 Página: 402/420
16/04/2019      Remetido ao DJE 
Relação: 0130/2019 Teor do ato: Ante o exposto, julgo PROCEDENTES os pedidos, com resolução do mérito, nos termos do artigo 487, inciso I, do Código de Processo Civil, para que procedam as requeridas GOOGLE e FACEBOOK, respectivamente, à remoção da página sustentadas nas URL https://www.youtube.com/channel/UCOMI2Kd2YtfpicY5UJXiXhg e https://www.facebook.com/leiamirandaoficial1/, bem como forneça os IPs sob sua guarda, dos usuários responsáveis pela criação e acessos administrativos das páginas, com a identificação da data e horário destes, confirmando a tutela de urgência. Cada parte arcará com os honorários advocatícios de seus próprios patronos e com as custas e despesas a que estão ordinariamente obrigadas, ante a ausência de pretensão resistida, pois necessária a intervenção judicial, como acima delineado. Transitada em julgado, ao arquivo, dando-se baixa na distribuição. P.I.C. Advogados(s): Celso de Faria Monteiro (OAB 138436/SP), Fabio Rivelli (OAB 297608/SP), Rafael Gomes Anastacio (OAB 320579/SP)
09/04/2019      Julgada Procedente a Ação 
Ante o exposto, julgo PROCEDENTES os pedidos, com resolução do mérito, nos termos do artigo 487, inciso I, do Código de Processo Civil, para que procedam as requeridas GOOGLE e FACEBOOK, respectivamente, à remoção da página sustentadas nas URL https://www.youtube.com/channel/UCOMI2Kd2YtfpicY5UJXiXhg e https://www.facebook.com/leiamirandaoficial1/, bem como forneça os IPs sob sua guarda, dos usuários responsáveis pela criação e acessos administrativos das páginas, com a identificação da data e horário destes, confirmando a tutela de urgência. Cada parte arcará com os honorários advocatícios de seus próprios patronos e com as custas e despesas a que estão ordinariamente obrigadas, ante a ausência de pretensão resistida, pois necessária a intervenção judicial, como acima delineado. Transitada em julgado, ao arquivo, dando-se baixa na distribuição. P.I.C.
09/04/2019      Conclusos para Sentença 
08/04/2019      Petição Juntada 
Nº Protocolo: WJMJ.19.40477877-0 Tipo da Petição: Petições Diversas Data: 08/04/2019 15:22
08/04/2019      Conclusos para Despacho 
03/04/2019      Petição Juntada 
Nº Protocolo: WJMJ.19.40451659-7 Tipo da Petição: Petições Diversas Data: 03/04/2019 13:22"}]'

Here part of the code HTML inside "tabelaUltimasMovimentacoes"

<tbody id="tabelaUltimasMovimentacoes">
<tr class="fundoClaro" style="">
<td style="vertical-align: top" width="120">
        22/04/2019
    </td>
<td aria-hidden="true" valign="top" width="20">
</td>
<td style="vertical-align: top; padding-bottom: 5px">




                Certidão de Publicação Expedida



        <br/>
<span style="font-style: italic;">
            Relação :0130/2019
Data da Disponibilização: 22/04/2019
Data da Publicação: 23/04/2019
Número do Diário: 2792
Página: 402/420
        </span>
</td>
</tr>
<tr class="fundoEscuro" style="">
<td style="vertical-align: top" width="120">
        16/04/2019
    </td>
<td aria-hidden="true" valign="top" width="20">
</td>
<td style="vertical-align: top; padding-bottom: 5px">




                Remetido ao DJE



        <br/>
<span style="font-style: italic;">
            Relação: 0130/2019
Teor do ato: Ante o exposto, julgo PROCEDENTES os pedidos, com resolução do mérito, nos termos do artigo 487, inciso I, do Código de Processo Civil, para que procedam as requeridas GOOGLE e FACEBOOK, respectivamente, à remoção da página sustentadas nas URL https://www.youtube.com/channel/UCOMI2Kd2YtfpicY5UJXiXhg e https://www.facebook.com/leiamirandaoficial1/, bem como forneça os IPs sob sua guarda, dos usuários responsáveis pela criação e acessos administrativos das páginas, com a identificação da data e horário destes, confirmando a tutela de urgência. Cada parte arcará com os honorários advocatícios de seus próprios patronos e com as custas e despesas a que estão ordinariamente obrigadas, ante a ausência de pretensão resistida, pois necessária a intervenção judicial, como acima delineado. Transitada em julgado, ao arquivo, dando-se baixa na distribuição. P.I.C.
Advogados(s): Celso de Faria Monteiro (OAB 138436/SP), Fabio Rivelli (OAB 297608/SP), Rafael Gomes Anastacio (OAB 320579/SP)
        </span>
</td>
</tr>

Please, does anyone know how I could extract all the text and create the dictionary?

Reinaldo Chaves
  • 965
  • 4
  • 16
  • 43
  • Possible duplicate of [retrieve links from web page using python and BeautifulSoup](https://stackoverflow.com/questions/1080411/retrieve-links-from-web-page-using-python-and-beautifulsoup) – VanBantam Apr 26 '19 at 19:57
  • I would suggest searching a bit more carefully on stack overflow. There are several existing questions with answers that are closely related to your question that can help you solve your problem. https://stackoverflow.com/questions/5815747/beautifulsoup-getting-href – VanBantam Apr 26 '19 at 19:58

1 Answers1

1

This is a little hack'y but uses requests to get the html passed to pandas to extract the table. Then some cosmetics done on the table.

import pandas as pd
import requests
import urllib3; urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
pd.options.mode.chained_assignment = None
r = requests.get('https://esaj.tjsp.jus.br/cpopg/show.do?processo.codigo=2S000YR9Q0000&processo.foro=100&paginaConsulta=2&conversationId=&dadosConsulta.localPesquisa.cdLocal=100&cbPesquisa=NMPARTE&dadosConsulta.tipoNuProcesso=UNIFICADO&dadosConsulta.valorConsulta=Google&uuidCaptcha=&pbEnviar=Pesquisar', verify = False)
tables = pd.read_html(r.content)
result = tables[4].head()
result.drop(['Unnamed: 1'], axis=1, inplace = True)
print(result)

Using selenium to click to show more:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import pandas as pd
from bs4 import BeautifulSoup as bs
url = 'https://esaj.tjsp.jus.br/cpopg/show.do?processo.codigo=2S000YR9Q0000&processo.foro=100&paginaConsulta=2&conversationId=&dadosConsulta.localPesquisa.cdLocal=100&cbPesquisa=NMPARTE&dadosConsulta.tipoNuProcesso=UNIFICADO&dadosConsulta.valorConsulta=Google&uuidCaptcha=&pbEnviar=Pesquisar'
d = webdriver.Chrome()
d.get(url)
WebDriverWait(d, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#linkmovimentacoes'))).click()
time.sleep(1)
pd.options.mode.chained_assignment = None
tables = pd.read_html(d.find_element_by_css_selector('#divLinksTituloBlocoMovimentacoes + table').get_attribute('outerHTML'))
result = tables[0]
result.drop(['Unnamed: 1'], axis=1, inplace = True)
print(result)
d.quit()
QHarr
  • 83,427
  • 12
  • 54
  • 101
  • Thank you very much @QHarr. I just can not seem to extract all the lines. Notice that clicking ">>Listar todas as movimentações." opens the entire table. This is what I'm trying to get – Reinaldo Chaves Apr 28 '19 at 15:06
  • I have had to use selenium to get full list. Answer edited. – QHarr Apr 28 '19 at 15:25
  • Thank you very much @QHarr. The location in the HTML that has the '#divLinksTituloBlocoMovimentacoes + table' has an XPath '/html/body/div/table[4]/tbody/tr/td/table[5]', looking to inspect element on the site. Please, I just do not understand how you got the "#divLinksTituloBlocoMovimentacoes + table" – Reinaldo Chaves Apr 28 '19 at 22:56
  • 1
    The element before the table of interest has id divLinksTituloBlocoMovimentacoes. So I use [adjacent sibling combinator](https://developer.mozilla.org/en-US/docs/Web/CSS/Adjacent_sibling_combinator) to specify I want the table immediately after the element with id divLinksTituloBlocoMovimentacoes. I can see that relationship simply by looking at the html for that table by using inspect element.. – QHarr Apr 29 '19 at 05:48