1

私はウェブサイトからいくつかのデータをスクレイピングしていますが、以下のコードを使用してそれを行うことができます:

import csv
import urllib2
import sys
import time
from bs4 import BeautifulSoup
from itertools import islice
page = urllib2.urlopen('http://shop.o2.co.uk/mobile_phones/Pay_Monthly/smartphone/all_brands').read()
soup = BeautifulSoup(page)
soup.prettify()
with open('O2_2012-12-21.csv', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=',')
    spamwriter.writerow(["Date","Month","Day of Week","OEM","Device Name","Price"])
    oems = soup.findAll('span', {"class": "wwFix_h2"},text=True)
    items = soup.findAll('div',{"class":"title"})
    prices = soup.findAll('span', {"class": "handset"})
    for oem, item, price in zip(oems, items, prices):
            textcontent = u' '.join(islice(item.stripped_strings, 1, 2, 1))
            if textcontent:
                    spamwriter.writerow([time.strftime("%Y-%m-%d"),time.strftime("%B"),time.strftime("%A") ,unicode(oem.string).encode('utf8').strip(),textcontent,unicode(price.string).encode('utf8').strip()])

さて、問題は、私がスクレイピングしているすべての価格値のうちの2つで、残りの値とは異なるhtml構造を持っています。このため、出力 csv には「なし」の値が表示されます。Web ページの価格の通常の html 構造は次のとおりです。 <span class="handset"> FREE to £79.99</span>

これらの2つの値の構造は <span class="handset"> <span class="delivery_amber">Up to 7 days delivery</span> <br>"FREE on all tariffs"</span>

私が今得ているものは、すべての関税の無料の代わりに2番目のhtml構造にNoneを表示します。また、すべての関税の価格値無料は、2番目の構造の二重引用符の下に記載されていますが、最初の構造の引用符の外側にあります

この問題を解決するのを手伝ってください。私はプログラミングに慣れていないので、私の無知を許してください。

4

1 に答える 1

1

if追加のステートメントでこれら 2 つの項目を検出するだけです。

if price.string is None:
    price_text = u' '.join(price.stripped_strings).replace('"', '').encode('utf8')
else:
    price_text = unicode(price.string).strip().encode('utf8')

次にprice_text、CSV ファイルに使用します。"単純な置換呼び出しで引用符を削除したことに注意してください。

于 2012-12-21T11:30:12.823 に答える