如何抓取分成多个块的信息?

时间:2019-04-11 21:39:04

标签: python web-scraping beautifulsoup python-requests

在python3中,我需要抓取site

该网站上的每个查询都会生成一系列我想捕获的信息:

1-法律程序数量,

2-流程类型(例如-Procedimento ComumCível/Indenizaçãopor Dano Moral),

3-字符串'Reqdo:'或'Reqte:',

4-各自的名称(例如Google Brasil Internet Ltda),

5-日期

6-处理位置(例如-9ªVara de FazendaPública)

为此,我隔离了法律程序信息所在的区域

from bs4 import BeautifulSoup
import requests

link = 'https://esaj.tjsp.jus.br/cpopg/search.do?conversationId=&dadosConsulta.localPesquisa.cdLocal=-1&cbPesquisa=NMPARTE&dadosConsulta.tipoNuProcesso=UNIFICADO&dadosConsulta.valorConsulta=Google&uuidCaptcha=&pbEnviar=Pesquisar'

try:
    res = requests.get(link, verify=False) # I ignore SSLError just this case
except (requests.exceptions.HTTPError, requests.exceptions.RequestException, requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
    print(str(e))
    return 
except Exception as e:
    print("Exception")
    return

soup =  BeautifulSoup(res.text, "lxml")

bloco = soup.find_all('div', {'id': 'listagemDeProcessos'})

“ bloco”内容为第一行:

[<div id="listagemDeProcessos">
<div style="padding:0px 10px;">
<div class="">
<br/>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr valign="top">
<td background="/cpopg/imagens/spw/fundo_subtitulo.gif" height="21" nowrap="" valign="top">
<h2 class="subtitle">
                        Foro Central - Fazenda Pública/Acidentes

                    </h2>
</td>
<td aria-hidden="true" background="/cpopg/imagens/spw/fundo_subtitulo2.gif" width="90%">
<img height="20" src="/cpopg/imagens/spw/final_subtitulo.gif" tabindex="-1" width="16"/>
</td>
</tr>
</table>
<br/>
<table border="0" cellpadding="2" cellspacing="0" class="secaoFormBody" id="" style="" width="100%">
</table>
</div>
</div>
<div class="fundoClaro" id="divProcesso2S000X02D0000" style="margin-left: 10px; margin-top: 0px;">
<div class="fundoClaro">
<div class="nuProcesso">
<!-- Atributos -->
<a class="linkProcesso" href="/cpopg/show.do?processo.codigo=2S000X02D0000&amp;processo.foro=53&amp;paginaConsulta=1&amp;conversationId=&amp;dadosConsulta.localPesquisa.cdLocal=-1&amp;cbPesquisa=NMPARTE&amp;dadosConsulta.tipoNuProcesso=UNIFICADO&amp;dadosConsulta.valorConsulta=Google&amp;uuidCaptcha=&amp;pbEnviar=Pesquisar">
            1094431-73.2018.8.26.0100   
        </a>
<span class="">
</span>
</div>                    
    Procedimento Comum Cível <b>/</b> Indenização por Dano Moral 
    <br/>
<div class="espacamentoLinhas">
<span style="font-weight: bold">Reqdo:</span>
            Google Brasil Internet Ltda

        </div>
<div class="espacamentoLinhas">
<span style="font-weight: bold">Recebido em:</span>
        11/09/2018 - 9ª Vara de Fazenda Pública
    </div>
</div>
</div>
<div class="fundoEscuro" id="divProcesso1H00079DG0000" style="margin-left: 10px; margin-top: 12px;">
<div class="fundoEscuro">
<div class="nuProcesso">
<!-- Atributos -->
<a class="linkProcesso" href="/cpopg/show.do?processo.codigo=1H00079DG0000&amp;processo.foro=53&amp;paginaConsulta=1&amp;conversationId=&amp;dadosConsulta.localPesquisa.cdLocal=-1&amp;cbPesquisa=NMPARTE&amp;dadosConsulta.tipoNuProcesso=UNIFICADO&amp;dadosConsulta.valorConsulta=Google&amp;uuidCaptcha=&amp;pbEnviar=Pesquisar">
            1045899-54.2014.8.26.0053   
        </a>
<span class="">
</span>
</div>                    
    Procedimento Comum Cível <b>/</b> Crédito Tributário 
    <br/>
<div class="espacamentoLinhas">
<span style="font-weight: bold">Reqte:</span>
            Google Brasil Internet Ltda.

        </div>
<div class="espacamentoLinhas">
<span style="font-weight: bold">Recebido em:</span>
        31/10/2014 - 10ª Vara de Fazenda Pública
    </div>
</div>
</div>
<div class="fundoClaro" id="divProcesso1H00020270000" style="margin-left: 10px; margin-top: 12px;">
<div class="fundoClaro">
<div class="nuProcesso">

我注意到所有信息块都由字符串'<!-- Atributos -->'

分隔

这也可以视为标签吗?

我认为捕获信息块的一种策略是捕获具有字符串'<!-- Atributos -->'

的所有内容。

然后遍历它们并提取感兴趣的信息

那有意义吗?拜托,我该怎么办?

2 个答案:

答案 0 :(得分:1)

您可以使用div[id^=divProcesso]选择器来获取 bloco ,这意味着具有 id div divProcesso 开头。 / p>

blocos = soup.select("div[id^=divProcesso]")
for bloco in blocos:
    number = bloco.find('a', {'class': 'linkProcesso'}).text.strip()
    process_type = "/".join(bloco.select_one("div.nuProcesso")
                            .find_next_siblings(text=True)).strip()

    reqdo = ""
    reqte = ""
    espacamentoLinhas = bloco.select(".espacamentoLinhas")
    if "Reqdo:" in espacamentoLinhas[0].text:
        reqdo = espacamentoLinhas[0].text.replace("Reqdo:", "").strip()
    else:
        reqte = espacamentoLinhas[0].text.replace("Reqte:", "").strip()

    recebido_em = espacamentoLinhas[1].text.replace("Recebido em:", "").strip().split("-", maxsplit=1)
    recebido_em_date = recebido_em[0].strip()
    recebido_em_location = recebido_em[1].strip()

答案 1 :(得分:1)

BeautifulSoup 4.7+使用一个名为Soup Sieve的选择库,该库与BeautifulSoup一起安装。您可以直接将其导入并创建CSS选择器匹配模式:

import soupsieve as sv

# Create CSS patterns to find data that we want to capture
legal_process = sv.compile('div.nuProcesso')
info1 = sv.compile('br + div.espacamentoLinhas')
info2 = sv.compile('div.espacamentoLinhas + div.espacamentoLinhas')

进程类型没有包装在易于确定的元素中,但是它遵循进程号,因此我们可以创建一个简单的函数来提取紧随其后的文本,直到点击下一个div

def get_process_type(el):
    # Text is found right after this child, so gather text until we hit next div
    text = []
    sibling = el.next_sibling
    while True:
        if isinstance(sibling, NavigableString):
            text.append(sibling)
        elif isinstance(sibling, Tag):
            if sibling.name == 'div':
                break
            text.append(sibling.text)
        sibling = sibling.next_sibling
    return ''.join(text).strip().replace('\xa0', '')

然后,我们可以将它们放在一起。在这里,我们基本上以ID为div的{​​{1}}的所有子项为目标,然后匹配每个子项并处理每个子项的数据提取。每次找到进程号时,我们都会在列表中开始一个新条目:

listagemDeProcessos

输出

from bs4 import BeautifulSoup, Tag, NavigableString
import soupsieve as sv
import requests
import re

link = 'https://esaj.tjsp.jus.br/cpopg/search.do?conversationId=&dadosConsulta.localPesquisa.cdLocal=-1&cbPesquisa=NMPARTE&dadosConsulta.tipoNuProcesso=UNIFICADO&dadosConsulta.valorConsulta=Google&uuidCaptcha=&pbEnviar=Pesquisar'

try:
    res = requests.get(link, verify=False) # I ignore SSLError just this case
except (requests.exceptions.HTTPError, requests.exceptions.RequestException, requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
    print(str(e))
except Exception as e:
    print("Exception")

soup =  BeautifulSoup(res.text, "lxml")

# Create CSS patterns to find data that we want to capture
legal_process = sv.compile('div.nuProcesso')
info1 = sv.compile('br + div.espacamentoLinhas')
info2 = sv.compile('div.espacamentoLinhas + div.espacamentoLinhas')
date_split = re.compile(r'-\s+(?:\d+\xaa)?')

def get_process_type(el):
    # Text is found right after this child, so gather text until we hit next div
    text = []
    sibling = el.next_sibling
    while True:
        sibling = sibling.next_sibling
        if isinstance(sibling, NavigableString):
            text.append(sibling)
        elif isinstance(sibling, Tag):
            if sibling.name == 'div':
                break
    return ''.join(text).strip()

records = []

for child in soup.select('div#listagemDeProcessos *'):
    if legal_process.match(child):
        # Store process number
        records.append({"process": child.text.strip()})

        # Store process type
        records[-1]['type'] = get_process_type(child)

    elif info1.match(child):
        # Store required label and name
        records[-1]['label'], records[-1]['name'] = [item.strip() for item in child.text.split(':', 1)]
    elif info2.match(child):
        # Store date and location
        print(child.text)
        records[-1]['date'], records[-1]['location'] = [item.strip() for item in date_split.split(child.text.split(':', 1)[1], 1)]

print(records)

编辑:修复了[{'process': '1045899-54.2014.8.26.0053', 'type': 'Procedimento Comum Cível/Crédito Tributário', 'label': 'Reqte', 'name': 'Google Brasil Internet Ltda.', 'date': '31/10/2014', 'location': 'Vara de Fazenda Pública'}, {'process': '0023942-53.2010.8.26.0053 \n\t\t\n\n\t\t\t(053.10.023942-3)', 'type': 'Procedimento Comum Cível/Indenização por Dano Material', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '20/07/2010', 'location': 'Vara de Fazenda Pública'}, {'process': '1094431-73.2018.8.26.0100', 'type': 'Procedimento Comum Cível/Indenização por Dano Moral', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '11/09/2018', 'location': 'Vara Cível'}, {'process': '1030857-42.2019.8.26.0100', 'type': 'Liquidação por Arbitramento/Valor da Execução / Cálculo / Atualização', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '05/04/2019', 'location': 'Vara Cível'}, {'process': '1030497-10.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Práticas Abusivas', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '05/04/2019', 'location': 'Vara Cível'}, {'process': '1030110-92.2019.8.26.0100', 'type': 'Ação Civil Pública Cível/Prestação de Serviços', 'label': 'Reqdo', 'name': 'Empresa Controladora do Site Google', 'date': '04/04/2019', 'location': 'Vara Cível'}, {'process': '1028847-25.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Direito de Imagem', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '01/04/2019', 'location': 'Vara Cível'}, {'process': '1028109-37.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Direito de Imagem', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '29/03/2019', 'location': 'Vara Cível'}, {'process': '1027277-04.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Direito de Imagem', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '27/03/2019', 'location': 'Vara Cível'}, {'process': '1026784-27.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Direito de Imagem', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda.', 'date': '27/03/2019', 'location': 'Vara Cível'}, {'process': '1067163-47.2018.8.26.0002', 'type': 'Procedimento Comum Cível/Atos Unilaterais', 'label': 'Reqte', 'name': 'Google Brasil Internet Ltda', 'date': '19/12/2018', 'location': 'Vara Cível'}, {'process': '0017668-14.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Obrigação de Fazer / Não Fazer', 'label': 'Reqdo', 'name': 'Google Brasil Internet LTDA', 'date': '22/03/2019', 'location': 'Vara Cível'}, {'process': '1010443-26.2019.8.26.0002', 'type': 'Procedimento Comum Cível/Marca', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '28/02/2019', 'location': 'VARA EMPRESARIAL E CONFLITOS DE ARBITRAGEM'}, {'process': '1019636-62.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Marca', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda.', 'date': '07/03/2019', 'location': 'Vara Cível'}, {'process': '1019227-86.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Direito de Imagem', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda.', 'date': '06/03/2019', 'location': 'Vara Cível'}, {'process': '1018870-09.2019.8.26.0100', 'type': 'Embargos de Terceiro Cível/Constrição / Penhora / Avaliação / Indisponibilidade de Bens', 'label': 'Embargdo', 'name': 'Google Brasil Internet LTDA', 'date': '04/03/2019', 'location': 'Vara Cível'}, {'process': '1017903-61.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Defeito, nulidade ou anulação', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '28/02/2019', 'location': 'Vara Cível'}, {'process': '1017420-31.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Direito Autoral', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '27/02/2019', 'location': 'Vara Cível'}, {'process': '1016588-95.2019.8.26.0100', 'type': 'Produção Antecipada da Prova/Provas', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda.', 'date': '26/02/2019', 'location': 'Vara Cível'}, {'process': '1015924-64.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Propriedade Intelectual / Industrial', 'label': 'Reqdo', 'name': 'Google Internet Brasil Ltda', 'date': '22/02/2019', 'location': 'VARA EMPRESARIAL E CONFLITOS DE ARBITRAGEM'}, {'process': '1015478-61.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Direito de Imagem', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '22/02/2019', 'location': 'Vara Cível'}, {'process': '1015189-31.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Direito de Imagem', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda.', 'date': '21/02/2019', 'location': 'Vara Cível'}, {'process': '1012927-11.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Direito de Imagem', 'label': 'Reqdo', 'name': 'Google Brasil Internet Ltda', 'date': '15/02/2019', 'location': 'Vara Cível'}, {'process': '1011615-97.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Direito de Imagem', 'label': 'Reqdo', 'name': 'Google Internet Brasil Ltda', 'date': '12/02/2019', 'location': 'Vara Cível'}, {'process': '1011601-16.2019.8.26.0100', 'type': 'Procedimento Comum Cível/Marca', 'label': 'Reqdo', 'name': 'Google Internet Brasil Ltda', 'date': '12/02/2019', 'location': 'Vara Cível'}] 功能。