1

javascriptsを使用してデータをロードするWebサイトからデバイスの価格情報を取得しようとしています。JSONディクショナリ構造でデータを取得しています。以下は私が使用しているコードです:

# -*- coding: cp1252 -*-
import csv
import urllib2
import sys
import time
import re
import json
from bs4 import BeautifulSoup
from itertools import islice
from pprint import pprint

page = urllib2.urlopen('http://www.vodafone.de/privat/tarife/red-smartphone-tarife.html').read()
soup = BeautifulSoup(page)
x = [None]*1000

i = 0
j = 0
k = 0
scripts = soup.find_all('script')
script = next(s.text for s in scripts if s.string and 'window.rates' in s.string)
datastring = script.split('phones=')[1].split(';window.')[0]
datastring = re.sub(ur'([{,])([a-z]\w*):', ur'\1"\2":', datastring)
data = json.loads(datastring)

for d in data:
    for j in data[d]:
        pprint(data[d]['name']) 
        x[i] = data[d]['name']
        i = i + 1

この部分は私にウェブページからのデバイスのリストを与えます。

ただし、同じ方法を使用して、JSONデータディクショナリ内のもう1つのレベルである価格情報(下記)を取得すると、TypeError: string indices must be integers-

for d in data:
    for j in data[d]:
        for k in data[d][j]:
            pprint(data[d][j][k]) 
            x[i] = data[d][j][k]
            i = i + 1

これが私がスクレイピングしていて情報を抽出する必要があるJSONデータ構造のスニペットです:

{u'deliveryTime': u'Lieferbar innerhalb 48 Stunden',
 u'image': u'/images/m707491_300465.jpg',
 u'name': u'BlackBerry Bold 9900',
 u'sku1104261': {u'e': u'169.90', u'p': u'prod974431'},
 u'sku1444275': {u'e': u'129.90', u'p': u'prod974431'},
 u'sku1444283': {u'e': u'89.90', u'p': u'prod974431'},
 u'sku1444286': {u'e': u'49.90', u'p': u'prod974431'},
 u'sku1444291': {u'e': u'49.90', u'p': u'prod974431'}}
{u'deliveryTime': u'Vorauss. verfügbar ab Mitte Januar',
 u'image': u'/images/m1327474_300658.jpg',
 u'name': u'HTC One X+ mit limitiertem Beats-Headset',
 u'sku1444277': {u'e': u'249.90', u'p': u'prod1624433'},
 u'sku1444285': {u'e': u'119.90', u'p': u'prod1624433'},
 u'sku1444287': {u'e': u'99.90', u'p': u'prod1624433'},
 u'sku1444292': {u'e': u'99.90', u'p': u'prod1624433'},
 u'sku1474223': {u'e': u'399.90', u'p': u'prod1624433'}}

この問題を解決するのを手伝ってください。

4

1 に答える 1

1

投稿したJSON構造によると、次のようになります。

price = 0
for key, value in data.items():
    if key.startswith(u'sku') and isinstance(value, dict): 
        price += value.get(u'e', 0)

実際、ここにいくつかの基本的な概念があります。

  • キーが必要であることを確認します(「sku」で始まらないキーをスキップします)
  • サブキーがdictであることを検証します
  • .get()直接参照の代わりにdictのメソッドを使用します。このメソッドを使用すると、dictにそのようなキーがない場合に返されるデフォルト値を指定できます(例外は発生しません)。
于 2013-01-09T16:11:06.733 に答える