我正在尝试使用Python的BeautifulSoup和Requests从巴西最高法院获取数据。
144个链接中的每一个最后都有1到3之间的数字(例如:http://www.stf.jus.br/portal/remuneracao/listarRemuneracao.asp?periodo=012007&ano=2007&mes=01&folha=3)。
'folha'(表格,葡萄牙语)部分没有图案。有些月份是1,其他月份是2或3.这似乎是随机的。当访问具有错误号码的URL时,该网站会加载,但会显示“A folhasolicitadanãoéválida”(请求的表格无效,请使用葡萄牙语)。
在我的代码(下面)中,在创建包含没有“工作表”编号的链接的列表后,我加载页面并检查消息是否存在。如果是,使用try方法,代码会在URL中附加以下数字(2或3)。
但是代码没有运行。有没有办法在代码中使用try / except 3个可能的结果?
records=[]
for x in links:
r = requests.get(x+'1')
soup = BeautifulSoup(r.text, 'html.parser')
if BeautifulSoup(r.text, 'html.parser') == 'A folha solicitada não é válida':
try:
r = requests.get(x+'2')
soup = BeautifulSoup(r.text, 'html.parser')
if BeautifulSoup(r.text, 'html.parser') == 'A folha solicitada não é válida':
try:
r = requests.get(x+'3')
soup = BeautifulSoup(r.text, 'html.parser')
else:
continue
else:
continue
mes = x[-30:-28]+'/'+x[-28:-24]
ativos = soup.find_all('table', {'id':'ministros_ativos'})
ativos = ativos[0]
for x in range(0,11):
nome = ativos.find_all('a', {'class':'exibirServidor'})[x].text
salarios = ativos.contents[3].findAll('td', {'align':'right'})
salarios_brutos = salarios[::2]
salarios_liquidos = salarios[1::2]
for x in salarios_liquidos:
liquido = x.text
for x in salarios_brutos:
bruto = x.text
records.append((nome, bruto, liquido, mes))
答案 0 :(得分:1)
您可以使用range
创建1到3之间的数字列表,并迭代该列表以生成网址。如果响应有效,请中断循环并继续执行代码。
for x in links:
for i in range(1,4):
try:
r = requests.get(x+str(i))
except Exception as e:
continue
if 'A folha solicitada não é válida' not in r.text:
break
else:
continue
soup = BeautifulSoup(r.text, 'html.parser')
注意:
对于python 2,您必须将错误消息转为unicode。 (使用u
前缀)
requests
不会引发404响应的异常,因此您不需要尝试/除此之外,但是可能会发生其他异常。
使用except
来捕获异常。在{/ 1}}之后的try / except / else块中使用else
,如果没有异常发生则执行except
。
如果循环没有中断,则执行for / else块中的else
语句。基本上它意味着“如果没有收到有效的响应,则继续下一个x
”。