如何从带有tr,td和span的表中提取所有文本?

时间:2019-04-26 19:48:40

标签: python web-scraping html-table

在python3中,我想从website中提取表的所有文本内容。但是,信息的组织方式不是使用常规表,而是使用tr,td和span

该信息位于屏幕上的“Movimentações”块中

开始提取程序:

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"})

我只想提取行中的所有文本并像这样进行组织(以第一行为例):

[{"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"}]'

“ tabelaUltimasMovimentacoes”中的部分HTML代码

<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>

请,有人知道我如何提取所有文本并创建字典?

1 个答案:

答案 0 :(得分:1)

这有点hack'y,但是使用请求将html传递给熊猫以提取表格。然后在桌子上洗一些化妆品。

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)

使用硒单击以显示更多:

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()