【问题标题】:How to extract all text from a table with tr, td and span?如何从具有 tr、td 和 span 的表中提取所有文本?
【发布时间】:2019-09-16 08:26:29
【问题描述】:

在 python3 中,我想从website 中提取表格的所有文本内容。但是信息的组织方式不是用常规的table,而是用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>

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

【问题讨论】:

标签: python web-scraping html-table


【解决方案1】:

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

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)

使用selenium点击显示更多:

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。我似乎无法提取所有行。请注意,单击“>>Listar todas as movimentações”。打开整个表。这就是我想要得到的
  • 我不得不使用 selenium 来获取完整列表。答案已编辑。
  • 非常感谢@QHarr。 HTML 中具有“#divLinksTituloBlocoMovimentacoes + table”的位置具有 XPath“/html/body/div/table[4]/tbody/tr/td/table[5]”,用于检查站点上的元素。拜托,我只是不明白你是如何得到“#divLinksTituloBlocoMovimentacoes + table”的
  • 感兴趣的表之前的元素具有 id divLinksTituloBlocoMovimentacoes。所以我使用adjacent sibling combinator 来指定我想要紧跟在id 为divLinksTituloBlocoMovimentacoes 的元素之后的表格。我可以通过使用检查元素查看该表的 html 来查看这种关系..
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2012-04-16
相关资源
最近更新 更多