在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&processo.foro=53&paginaConsulta=1&conversationId=&dadosConsulta.localPesquisa.cdLocal=-1&cbPesquisa=NMPARTE&dadosConsulta.tipoNuProcesso=UNIFICADO&dadosConsulta.valorConsulta=Google&uuidCaptcha=&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&processo.foro=53&paginaConsulta=1&conversationId=&dadosConsulta.localPesquisa.cdLocal=-1&cbPesquisa=NMPARTE&dadosConsulta.tipoNuProcesso=UNIFICADO&dadosConsulta.valorConsulta=Google&uuidCaptcha=&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 -->'
然后遍历它们并提取感兴趣的信息
那有意义吗?拜托,我该怎么办?
答案 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'}]
功能。