2017-11-21 6 views
-2

私はpython 3.6を使用していますが、私はテーブルからすべてのデータを取得している間にWebサイトからテーブルをスクラップしようとしています。私は以下のエラーメッセージを得た結果の終わり。私はPython 3.6でこのエラーに直面しています。IndexError Traceback(最近の最後の呼び出し)

IndexError Traceback (most recent call last) 
<ipython-input-29-45703b14c6ee> in <module>() 
     1 for tr in soup.find_all('tr')[2:]: 
     2  tds = tr.find_all('td') 
----> 3  print(tds[0].text, tds[1].text, tds[2].text) 

IndexError: list index out of range 

このコードで何が間違っていますか?どうすればいいですか?

+1

'tds'は、3つの要素を持っていません。存在しないインデックスにアクセスしようとしました。 3行目の前にtdsの完全な配列を出力してデバッグしようとしてください。 – jhilmer

答えて

1

要素にアクセスする前に、tdsの長さを確認したい場合があります。存在しない要素にアクセスすることはできません。

for tr in soup.find_all('tr')[:]: 
    tds = tr.find_all('td') 
    tds_length = len(tds) 
    # using tds_length, get what you want 
    # if tds_length < 2: print(tds[0].text) 

それとも

for tr in soup.find_all('tr')[:]: 
    tds = tr.find_all('td') 
    try: 
     print(tds[0].text) 
    except IndexError: 
     pass 
    else: 
     try: 
      print(tds[1].text) 
     except IndexError: 
      pass 
     else: 
      try: 
       print(tds[2].text) 
      except IndexError: 
       pass 
+0

2番目の解決策はエラーなしです –

+1

これはネストされたステートメントでこれを複雑にするのはなぜですか?すべての結果を出力したい場合は、 'td in tds:print(td.text)'を実行します。最大3まで印刷したい場合は、 'length = len(tds)ならばlen(tds)<4 else 3;範囲(長さ)のiに対して:print(tds [i] .text) '。 – Reti43

関連する問題