これは、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 つの質問があります。
- このような問題のトラブルシューティングなど、ScraperWiki インフラストラクチャで実行されるスクレイパーをデバッグするためのオプションは何ですか? たとえば、ステップスルーする方法はありますか?
- 「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)