首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试ScraperWiki刮板(产生假整数)

调试ScraperWiki刮板(产生假整数)
EN

Stack Overflow用户
提问于 2013-05-06 10:44:31
回答 1查看 122关注 0票数 0

下面是我在ScraperWiki上使用Python创建的一个刮板:

代码语言:javascript
复制
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"]。您可以看到,我添加了几行“调试”代码,以更好地理解正在发生的事情,但是调试代码并不深入。

我有两个问题:

  1. 我在ScraperWiki基础设施上运行的调试刮板的选项是什么,例如,如何解决像这样的问题?有办法走过去吗?
  2. 您能告诉我为什么要为“约克大学”行指定int 450而不是字符串"401-500“给data["arwu_rank"]吗?

编辑2013年5月6日,20:07h UTC

下面的刮板没有问题就完成了,但我仍然不知道为什么第一个刮刀在“约克大学”的线上失败了:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-06 11:38:52

在ScraperWiki上调试脚本没有简单的方法,不幸的是,它只发送完整的代码并获得结果,因此无法交互地执行代码。

我在代码副本中再添加了几个打印,它看起来就像分配数据的位之前的if检查。

代码语言:javascript
复制
if len(tr.cssselect("td.ranking")) > 0 and len(tr.cssselect("td.rankingname")) > 0:

不会触发“约克大学”,因此它将使int值(稍后设置)保持在循环前后的前一次。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16397058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档