1

一般的なコード:

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

page = urllib2.urlopen('http://www.vodafone.de/privat/tarife/red-smartphone-tarife.html').read()
soup = BeautifulSoup(page)
prices = soup.findAll('div', {"class": "price"})

この後、私はデータを取得するために次のコードを試しています:コード1:

for price in prices:
    print unicode(price.string).encode('utf8')

出力1:出力なし、コードはエラーなしで実行され、何も出力されません。

コード2:

for price in prices:
    textcontent3= u' '.join(price.stripped_strings)
    if textcontent3:
        print textcontent3

Output2:出力1と同じ状況で、再び出力はありません。

コード3:

for price in prices:
    fonttag = price.find('div')
    if fonttag is not None:
        print unicode(fonttag.string).encode('utf8').strip()

出力3:出力なし、出力1と同じ

この後、htmlの関連部分を印刷してみました。

コード4:

print prices

出力4:

</span></div>, <div class="price">
<span id="price"><br/>
</span></div>, <div class="price">
<span id="price"><br/>
</span></div>]

Output4からわかるように、htmlの美しいスープには価格の価値がありません。Webページ上では、このhtml構造は次のようになります。

<div class="price"><span id="price">49,90 €&lt;/span><br>einmalig</div>

美しいスープは、htmlページに記載されているように価格値を抽出していないため、価格のデータを取得できません。私はプログラミングに不慣れなので、この問題を解決するのを手伝ってください。私の無知を許してください。

4

1 に答える 1

1

このページでは、大きなJavaScript構造を使用して価格を読み込みます。その構造だけをロードできます。

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]

これにより、次のような大きなJavaScript構造が作成されます。

{sku844082:{name:"Samsung Galaxy SII",image:"/images/m677391_300468.jpg",deliveryTime:"Vorauss. verf&#252;gbar ab Anfang Januar",sku1444291:{p:"prod954312",e:"19.90"},sku1444286:{p:"prod954312",e:"19.90"},sku1444283:{p:"prod954312",e:"39.90"},sku1444275:{p:"prod954312",e:"59.90"},sku1104261:{p:"prod954312",e:"99.90"}},sku894279:{name:"BlackBerry Torch 9810",image:"/images/m727477_300464.jpg",deliveryTime:"Lieferbar innerhalb 48 Stunden",sku1444275:{p:"prod1004495",e:"179.90"},sku1104261:{p:"prod1004495",e:"259.90"},sku1444291:{p:"prod1004495",e:"29.90"},sku1444286:{p:"prod1004495",e:"29.90"},sku1444283:{p:"prod1004495",e:"49.90"}},sku864221:{name:"BlackBerry Bold 9900",image:"/images/m707491_300465.jpg",deliveryTime:"Lieferbar innerhalb 48 Stunden",sku1444275:{p:"prod974431",e:"129.90"},sku1104261:{p:"prod974431",e:"169.90"},sku1444291:{p:"prod974431",e:"49.90"},sku1444286:{p:"prod974431",e:"49.90"},sku1444283:{p:"prod974431",e:"89.90"}}

json残念ながら、これはモジュールに直接ロードすることはできません。有効なJavaScriptですが、キーを引用符で囲まないと、有効なJSONではありません。正規表現を使用してさらにクリーンアップするかp:"someprice"、その文字列から直接情報を取得する必要があります。

幸いなことに、構造は少量の正規表現の魔法で修正できます。

import re
import json

datastring = re.sub(ur'([{,])([a-z]\w*):', ur'\1"\2":', datastring)
data = json.loads(datastring)

pこれにより、製品コードとe価格を含むネストされたSKUを含む、データとしてネストされたdictを含むSKUキーと辞書を含む大きな辞書が得られます。

>>> from pprint import pprint
>>> pprint(data['sku864221'])
{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'}}
于 2013-01-02T12:44:54.060 に答える