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', '')
Тогда мы можем собрать все это вместе.Здесь мы в основном нацеливаемся на все дочерние элементы div
с идентификатором 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'}]
РЕДАКТИРОВАТЬ: Исправлена функция get_process_type
.