Как найти и хранить информацию с пустым классом и идентификатором? - PullRequest
1 голос
/ 23 апреля 2019

В python3 я хочу извлечь информацию с сайта и поместить в переменные

Например, в блоке "Dados do processo" я хочу сохранить:

"Indenização por Dano Moral"
"Direito de Imagem"
"Violeta Miera Arriba"
"R$ 38.160,00"

Чтобы изолировать блок:

from bs4 import BeautifulSoup
import requests

link = 'https://esaj.tjsp.jus.br/cpopg/show.do?processo.codigo=01001DTQA0000&processo.foro=1&uuidCaptcha=sajcaptcha_380320b510ee415ca0ca56cfac794999'

try:
    res = requests.get(link, verify=False) # avoid SSLError
except (requests.exceptions.HTTPError, requests.exceptions.RequestException, requests.exceptions.ConnectionError, requests.exceptions.Timeout) as e:
    print(str(e))
except Exception as e:
    print("Exceção")

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

janela1 = soup.find_all("table",{"class":"secaoFormBody"})[1]

dados_processo = janela1.find_all("tr",{"class":""})

Например, информация «Indenização por Dano Moral» находится в dados_processo

<tr class="">
<td id="" valign="" width="150">
<label class="labelClass" for="" style="text-align:right;font-weight:bold;;">Assunto:</label>
</td>
<td valign="">
<span class="" id="">Indenização por Dano Moral</span>
</td>
</tr>

Пожалуйста, кто-нибудь знает, как достичь "span class =" "id =“ ”? Я не получаю его, потому что таким образом он повторяется в нескольких точках блока и с" "для класса и" " для идентификатора

Я думал о поиске строки "Assunto:" в "label class =" labelClass "for =" "", если она найдена, она принимает строку в "span class =" "id =« » Эта проверка может быть полезна, поскольку на некоторых похожих сайтах могут отсутствовать все элементы

1 Ответ

2 голосов
/ 23 апреля 2019

Вы можете использовать :contains для нацеливания "заголовков" , а затем смежного братского (+) комбинатора для td, содержащего интересующее значение.Это использует bs4 4.7.1

from bs4 import BeautifulSoup as bs
import requests
import urllib3; urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

r = requests.get('https://esaj.tjsp.jus.br/cpopg/show.do?processo.codigo=01001DTQA0000&processo.foro=1&uuidCaptcha=sajcaptcha_380320b510ee415ca0ca56cfac794999', verify=False)
soup = bs(r.content, 'lxml')
print(soup.select_one('td:has(>.labelClass:contains("Assunto:")) + td').text.strip())
print(soup.select_one('td:has(>.labelClass:contains("Outros assuntos:")) + td').text.strip())
print(soup.select_one('td:has(>.labelClass:contains("Juiz:")) + td').text.strip())
print(soup.select_one('td:has(>.labelClass:contains("Valor da ação:")) + td').text.strip())

Вы можете использовать if для проверки наличия, если нет:

soup.select_one('td:has(>.labelClass:contains("Assunto:")) + td').text.strip() if soup.select_one('td:has(>.labelClass:contains("Assunto:")) + td') is not None else 'N/A'
...