0

Javascriptを介してデータを返すサイトをスクレイプしようとしています。BeautifulSoupを使用して作成したコードは非常にうまく機能しますが、スクレイピング中のランダムなポイントで次のエラーが発生します。

Traceback (most recent call last):
File "scraper.py", line 48, in <module>
accessible = accessible[0].contents[0]
IndexError: list index out of range

4つのURL、場合によっては15のURLを取得できる場合もありますが、ある時点でスクリプトが失敗し、上記のエラーが発生します。失敗の背後にあるパターンを見つけることができないので、私はここで本当に途方に暮れています-私は何が間違っているのですか?

from bs4 import BeautifulSoup
import urllib
import urllib2
import jabba_webkit as jw
import csv
import string
import re
import time

countries = csv.reader(open("countries.csv", 'rb'), delimiter=",")
database = csv.writer(open("herdict_database.csv", 'w'), delimiter=',')

basepage = "https://www.herdict.org/explore/"
session_id = "indepth;jsessionid=C1D2073B637EBAE4DE36185564156382"
ccode = "#fc=IN"
end_date = "&fed=12/31/"
start_date = "&fsd=01/01/"

year_range = range(2009, 2011)
years = [str(year) for year in year_range]

def get_number(var):
    number = re.findall("(\d+)", var)

    if len(number) > 1:
        thing = number[0] + number[1]
    else:
        thing = number[0]

    return thing

def create_link(basepage, session_id, ccode, end_date, start_date, year):
    link = basepage + session_id + ccode + end_date + year + start_date + year
    return link



for ccode, name in countries:
    for year in years:
        link = create_link(basepage, session_id, ccode, end_date, start_date, year)
        print link
        html = jw.get_page(link)
        soup = BeautifulSoup(html, "lxml")

        accessible = soup.find_all("em", class_="accessible")
        inaccessible = soup.find_all("em", class_="inaccessible")

        accessible = accessible[0].contents[0]
        inaccessible = inaccessible[0].contents[0]

        acc_num = get_number(accessible)
        inacc_num = get_number(inaccessible)

        print acc_num
        print inacc_num
        database.writerow([name]+[year]+[acc_num]+[inacc_num])

        time.sleep(2)
4

2 に答える 2

4

コードにエラー処理を追加する必要があります。多くのWebサイトをスクレイピングすると、一部のWebサイトが不正な形になるか、何らかの形で壊れます。その場合、空のオブジェクトを操作しようとします。

コードを調べて、機能すると想定しているすべての想定を見つけ、エラーがないか確認します。

その特定のケースでは、私はこれを行います:

if not inaccessible or not accessible:
    # malformed page
    continue
于 2013-01-24T20:14:16.130 に答える
3

soup.find_all("em", class_="accessible")おそらく空のリストを返しています。あなたが試すことができます:

if accessible:
    accessible = accessible[0].contents[0]

またはより一般的に:

if accessibe and inaccesible:
    accessible = accessible[0].contents[0]
    inaccessible = inaccessible[0].contents[0]
else:
    print 'Something went wrong!'
    continue
于 2013-01-24T20:11:08.517 に答える