Отладка скребка ScraperWiki (выдает ложное целое число)

Вот скребок, который я создал с помощью Python на ScraperWiki:

import lxml.html
import re
import scraperwiki

pattern = re.compile(r'\s')
html = scraperwiki.scrape("http://www.shanghairanking.com/ARWU2012.html")
root = lxml.html.fromstring(html)
for tr in root.cssselect("#UniversityRanking tr:not(:first-child)"):
    if len(tr.cssselect("td.ranking")) > 0 and len(tr.cssselect("td.rankingname")) > 0:
        data = {
            'arwu_rank'  : str(re.sub(pattern, r'', tr.cssselect("td.ranking")[0].text_content())),
            'university' : tr.cssselect("td.rankingname")[0].text_content().strip()
        }
    # DEBUG BEGIN
    if not type(data["arwu_rank"]) is str:
        print type(data["arwu_rank"])
        print data["arwu_rank"]
        print data["university"]
    # DEBUG END
    if "-" in data["arwu_rank"]:
        arwu_rank_bounds  = data["arwu_rank"].split("-")
        data["arwu_rank"] = int( ( float(arwu_rank_bounds[0]) + float(arwu_rank_bounds[1]) ) * 0.5 )
    if not type(data["arwu_rank"]) is int:
        data["arwu_rank"] = int(data["arwu_rank"])
    scraperwiki.sqlite.save(unique_keys=['university'], data=data)

Он работает отлично, за исключением случаев очистки последней строки данных таблицы (строки "Йоркского университета"), когда вместо строк с 9 по 11 кода вызывается извлечение строки "401-500" из таблицы и присвоение ей в data["arwu_rank"]эти строки почему-то вызывают 450 быть назначенным на data["arwu_rank"], Вы можете видеть, что я добавил несколько строк кода "отладки", чтобы лучше понять, что происходит, но также и то, что этот код отладки не идет очень глубоко.

У меня есть два вопроса:

  1. Какие есть варианты отладки скребков в инфраструктуре ScraperWiki, например, для устранения проблем, подобных этой? Например, есть ли способ пройти?
  2. Можете ли вы сказать мне, почему инт 450вместо строки "401-500" присваивается data["arwu_rank"] для линии "Йоркского университета"?

РЕДАКТИРОВАТЬ 6 мая 2013 г., 20:07 UTC

Следующий скребок завершается без проблем, но я все еще не уверен, почему первый скребок в линии "Йоркского университета":

import lxml.html
import re
import scraperwiki

pattern = re.compile(r'\s')
html = scraperwiki.scrape("http://www.shanghairanking.com/ARWU2012.html")
root = lxml.html.fromstring(html)
for tr in root.cssselect("#UniversityRanking tr:not(:first-child)"):
    if len(tr.cssselect("td.ranking")) > 0 and len(tr.cssselect("td.rankingname")) > 0:
        data = {
            'arwu_rank'  : str(re.sub(pattern, r'', tr.cssselect("td.ranking")[0].text_content())),
            'university' : tr.cssselect("td.rankingname")[0].text_content().strip()
        }
        # DEBUG BEGIN
        if not type(data["arwu_rank"]) is str:
            print type(data["arwu_rank"])
            print data["arwu_rank"]
            print data["university"]
        # DEBUG END
        if "-" in data["arwu_rank"]:
            arwu_rank_bounds  = data["arwu_rank"].split("-")
            data["arwu_rank"] = int( ( float(arwu_rank_bounds[0]) + float(arwu_rank_bounds[1]) ) * 0.5 )
        if not type(data["arwu_rank"]) is int:
            data["arwu_rank"] = int(data["arwu_rank"])
        scraperwiki.sqlite.save(unique_keys=['university'], data=data)

1 ответ

Решение

В ScraperWiki нет простого способа отладки ваших сценариев, к сожалению, он просто отправляет ваш код целиком и возвращает результаты, нет способа выполнить код в интерактивном режиме.

Я добавил еще пару отпечатков в копию вашего кода, и это выглядит как проверка if перед битом, который назначает данные

if len(tr.cssselect("td.ranking")) > 0 and len(tr.cssselect("td.rankingname")) > 0:

не запускается для "Йоркского университета", поэтому он будет хранить значение int (вы установили его позже) с предыдущего раза в цикле.

Другие вопросы по тегам