1

美しいスープを使用してWebサイトから2セットのデータをスクレイピングしています。それらを2列のcsvファイルに並べて出力したいと考えています。これには spamwriter.writerow([x,y]) 引数を使用していますが、再帰構造にエラーがあるため、csv ファイルに間違った出力が表示されると思います。以下は参照されたコードです:

import csv
import urllib2
import sys  
from bs4 import BeautifulSoup
page = urllib2.urlopen('http://www.att.com/shop/wireless/devices/smartphones.html').read()
soup = BeautifulSoup(page)
soup.prettify()
with open('Smartphones_20decv2.0.csv', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=',')        
    for anchor in soup.findAll('a', {"class": "clickStreamSingleItem"},text=True):
        if anchor.string:
            print unicode(anchor.string).encode('utf8').strip()         

    for anchor1 in soup.findAll('div', {"class": "listGrid-price"}):
        textcontent = u' '.join(anchor1.stripped_strings)
        if textcontent:
            print textcontent
            spamwriter.writerow([unicode(anchor.string).encode('utf8').strip(),textcontent])

私がcsvで取得している出力は次のとおりです。

Samsung Focus® 2 (Refurbished) $99.99
Samsung Focus® 2 (Refurbished) $99.99 to $199.99 8 to 16 GB
Samsung Focus® 2 (Refurbished) $0.99
Samsung Focus® 2 (Refurbished) $0.99
Samsung Focus® 2 (Refurbished) $149.99 to $349.99 16 to 64 GB

問題は、すべてのデバイスの価格が表示されているのに、列 1 にすべてではなく 1 つのデバイス名しか表示されないことです。プログラミング初心者のため、無知なことをお許しください。

4

1 に答える 1

1

anchor.stringの代わりにを使用していarchor1ます。現在のループのアイテムではなく、前のループanchor最後のアイテムです。

おそらく、より明確な変数名を使用すると、ここでの混乱を避けるのに役立ちます。使用singleitemし、gridpriceおそらく?

anchor1私は誤解しているかもしれませんが、それぞれを対応すると組み合わせたいと思いますanchorzip()おそらく:を使用して、それらを一緒にループする必要があります。

items = soup.findAll('a', {"class": "clickStreamSingleItem"},text=True)
prices = soup.findAll('div', {"class": "listGrid-price"})
for item, price in zip(items, prices):
    textcontent = u' '.join(price.stripped_strings)
    if textcontent:
        print textcontent
        spamwriter.writerow([unicode(item.string).encode('utf8').strip(),textcontent])

通常は、代わりに親テーブルの行をループして、ループ内のその行内のセルを見つける方が簡単です。ただし、セルが一致するものと一致してzip()いれば、も機能するはずです。clickStreamSingleItemlistGrid-price

于 2012-12-20T09:02:18.687 に答える