2017-08-28 3 views
1

私は、PythonのBeautifulSoupとRequestsを使用してブラジルの最高裁判所からデータを掻き出そうとしています。URLの末尾に3つの乱数を持つサイトを掻き集めるようにしてください。

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 folha solicitanãoéválida」と表示されます(要求されたシートは無効です)。

私のコード(下記)では、「シート」番号のないリンクを含むリストを作成した後、ページを読み込んでそのメッセージがあるかどうかを確認します。そうであれば、tryメソッドを使用して、コードに次の番号(2または3)がURLに付加されます。

しかし、コードは実行されません。 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

コードが実行されないとはどういう意味ですか? @NickAの入力ミスでエラー –

+0

がありますか?ありがとう、修正済み –

+0

@ whackamadoodle3000はい。この構成では、 'else'ステートメントに問題があります。しかし、それが実行されたとしても、URLを選択する生産的な方法があるかどうかを知ることに興味があります。 –

答えて

1

あなたは1と3の間の番号のリストを作成して、URLを生成するために、そのリストを反復するためrangeを使用することができます。応答が有効な場合は、ループを解除し、コードを続行します。

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を使用して例外をキャッチします。 elseは、try/except/elseブロックのexceptの後に使用され、例外が発生しない場合に実行されます。

for/elseブロック内のelseステートメントは、ループが中断しない場合に実行されます。基本的には、「有効な応答がない場合は次のxに進む」という意味です。

関連する問題