0

これは、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)

テーブルの最後のデータ行 (「York University」行) をスクレイピングする場合を除き、完全に機能します。この時点では、コードの 9 行目から 11 行目ではなく、文字列「401-500」がテーブルから取得され、割り当てられます。にdata["arwu_rank"]、これらの行が代わりに int450を に割り当てているようdata["arwu_rank"]です。何が起こっているのかをよりよく理解するために、数行の「デバッグ」コードを追加したことがわかりますが、そのデバッグ コードはそれほど深くは進んでいません。

2 つの質問があります。

  1. このような問題のトラブルシューティングなど、ScraperWiki インフラストラクチャで実行されるスクレイパーをデバッグするためのオプションは何ですか? たとえば、ステップスルーする方法はありますか?
  2. 「York University」行450に文字列「401-500」ではなくint が割り当てられている理由を教えてください。data["arwu_rank"]

編集 2013 年 5 月 6 日 20:07h UTC

次のスクレーパーは問題なく完了しますが、最初のスクレーパーが「York University」行で失敗した理由はまだわかりません。

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)
4

1 に答える 1

2

ScraperWiki でスクリプトをデバッグする簡単な方法はありません。残念ながら、コード全体を送信して結果を返すだけで、コードを対話的に実行する方法はありません。

コードのコピーにさらにいくつかのプリントを追加しました。データを割り当てるビットの前に if チェックのように見えます

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

「York University」ではトリガーされないため、前回のループの int 値 (後で設定します) が保持されます。

于 2013-05-06T11:38:52.983 に答える