下面是我在ScraperWiki上使用Python创建的一个刮板:
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)它的工作非常完美,除非在抓取表的最后数据行(“约克大学”行)时除外,在这一点上,导致从表中检索字符串"401-500“并分配给data["arwu_rank"]的代码的第9至11行似乎导致int 450被分配给data["arwu_rank"]。您可以看到,我添加了几行“调试”代码,以更好地理解正在发生的事情,但是调试代码并不深入。
我有两个问题:
450而不是字符串"401-500“给data["arwu_rank"]吗?编辑2013年5月6日,20:07h 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)发布于 2013-05-06 11:38:52
在ScraperWiki上调试脚本没有简单的方法,不幸的是,它只发送完整的代码并获得结果,因此无法交互地执行代码。
我在代码副本中再添加了几个打印,它看起来就像分配数据的位之前的if检查。
if len(tr.cssselect("td.ranking")) > 0 and len(tr.cssselect("td.rankingname")) > 0:不会触发“约克大学”,因此它将使int值(稍后设置)保持在循环前后的前一次。
https://stackoverflow.com/questions/16397058
复制相似问题