2

次のコードの出力をcsvファイルに書き込もうとしています。データが上書きされています。そのため、最終的に、Web サイトからスクレイピングされた最後のデータのみを出力ファイルに表示することができます。

from bs4 import BeautifulSoup
import urllib2
import csv
import re
import requests
for i in xrange(3179,7000):
    try:
        page = urllib2.urlopen("http://bvet.bytix.com/plus/trainer/default.aspx?id={}".format(i))
    except:
        continue
    else:
        soup = BeautifulSoup(page.read())
        for eachuniversity in soup.findAll('fieldset',{'id':'ctl00_step2'}):
            data = i, re.sub(r'\s+',' ',''.join(eachuniversity.findAll(text=True)).encode('utf-8')),'\n'
    print data  
    myfile = open("ttt.csv", 'wb')
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(data)

私はこれが初めてです。どこが間違っているのかわかりません。

アップデート

from bs4 import BeautifulSoup
import urllib2
import csv
import re
import requests
with open("BBB.csv", 'wb') as myfile:
    writer = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    for i in xrange(3179,7000):
        try:
            page = urllib2.urlopen("http://bvet.bytix.com/plus/trainer/default.aspx?id={}".format(i))
        except Exception:
            continue
        else:
            soup = BeautifulSoup(page.read())
            for eachuniversity in soup.findAll('fieldset',{'id':'ctl00_step2'}):
                data = [i] + [re.sub('\s+', '', text).encode('utf8') for text in eachuniversity.find_all(text=True) if text.strip()]
                writer.writerow(data)
4

3 に答える 3

5

ループする前に一度ファイルを開き、見つけたときにループ内でデータを追加します。

with open("ttt.csv", 'wb') as myfile:
    writer = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    for i in xrange(3179,7000):
        try:
            page = urllib2.urlopen("http://bvet.bytix.com/plus/trainer/default.aspx?id={}".format(i))
        except urllib2.HTTPError:
            continue
        else:
            soup = BeautifulSoup(page.read(), from_encoding=page.info().getparam('charset'))
            for eachuniversity in soup.findAll('fieldset',{'id':'ctl00_step2'}):
                data = [i] + [re.sub('\s+', ' ', text).strip().encode('utf8') for text in eachuniversity.find_all(text=True) if text.strip()]
                writer.writerow(data)

w書き込みモードでファイルを開くたびに、切り捨てられます。以前のデータはすべて削除され、これから書き込もうとしている新しいデータの場所が確保されます。その場合の秘訣は、ファイルを最初に一度だけ開き、開いたままにしておく必要があるすべてを書き込むことです。

ここのwithステートメントは、外側のforループが終了したときにファイルを閉じます。

from_encoding、サーバー ヘッダーによって指定された任意の文字セットを に渡すBeautifulSoupため、難しい推測を行う必要はありません。指定された URL に対して、そのキーワード パラメータを追加しないと、BeautifulSoup は実際には間違った推測をします。

各行に追加していた改行を削除しました。クラスがcsv.writer()改行を処理します。また、すべてではなく、実際にここでスローされている例外のみをキャッチするようにブランケットexcept:を変更しました。except urllib2.HTTPError:

テキストはクリーンアップされ、各テキスト エントリが個別の列に書き込まれます。

これにより、次のような出力が生成されます。

"3179","Neue Suche starten","MoHaJa - die Schule für Hunde und Halter","Stähli Monika","Meisenweg 1","3303 Jegenstorf","Routenplaner","Ausbildung/Anerkennung: Triple-S Ausbildungszentrum für Mensch und Hund","Sprache: Deutsch","Tel.: +41 31 761 14 33","Handy: +41 79 760 41 69","info@hundeschule-mohaja.ch","www.hundeschule-mohaja.ch"
"3180","Neue Suche starten","Dogs Nature","Fernandez Salome-Nicole","Dorzematte 30","3313 Büren zum Hof","Routenplaner","Ausbildung/Anerkennung: Triple-S Ausbildungszentrum für Mensch und Hund","Sprache: Deutsch","Tel.: 079 658 71 71","info@dogsnature.ch","www.dogsnature.ch"
"3181","Neue Suche starten","Gynny-Dog","Speiser Franziska","Wirtsgartenweg 27","4123 Allschwil","Routenplaner","Ausbildung/Anerkennung: Triple-S Ausbildungszentrum für Mensch und Hund","Sprache: Deutsch","Handy: 076 517 20 94","franziska.speiser@gynny-dog.ch","www.gynny-dog.ch"
"3183","Neue Suche starten","keep-natural","Mory Sandra","Beim Werkhof","4434 Hölstein","Routenplaner","Ausbildung/Anerkennung: Triple-S Ausbildungszentrum für Mensch und Hund","Sprache: Deutsch","Tel.: 079 296 00 65","sandra.mory@keep-natural.ch","www.keep-natural.ch"
"3184","Neue Suche starten","Küng Silvia","Eptingerstrasse 41","4448 Läufelfingen","Routenplaner","Ausbildung/Anerkennung: Triple-S Ausbildungszentrum für Mensch und Hund","Sprache: Deutsch","Tel.: 061 981 38 04","Handy: 079 415 83 57","silvia.kueng@hotmail.com","www.different-dogs.ch"
于 2013-11-12T22:30:12.663 に答える
2

次の行を移動します。

myfile = open("ttt.csv", 'wb')

forループの前に。ループのたびにファイルを上書きしています。

于 2013-11-12T22:29:52.980 に答える