Отладка скребка 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"]
, Вы можете видеть, что я добавил несколько строк кода "отладки", чтобы лучше понять, что происходит, но также и то, что этот код отладки не идет очень глубоко.
У меня есть два вопроса:
- Какие есть варианты отладки скребков в инфраструктуре ScraperWiki, например, для устранения проблем, подобных этой? Например, есть ли способ пройти?
- Можете ли вы сказать мне, почему инт
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 (вы установили его позже) с предыдущего раза в цикле.