• 締切済み

csvファイルに保存が出来ずに困っています!!

python初心者でございます。 python2.7,beautifulsoupを用いて競馬情報をスクレイピングしましたが、 作成されたhorse.csvファイルにデータ保存が出来ず、困っております。 csvファイルに保存出来るスクリプトを、御教示よろしくお願いいたします。 小生が作成したソースコード -*- coding:utf-8 -*- import urllib2 import codecs from bs4 import BeautifulSoup f = codecs.open('horse.csv', 'w', 'utf-8') f.write('tr1') tpl_url='http://db.netkeiba.com/?pid=jockey_detail&id=00663&page={0}' for i in xrange( 1, 2 ): url=tpl_url.format( i ) soup = BeautifulSoup(urllib2.urlopen(url).read(),"lxml") tr_arr = soup.find('div', {'id':'contents_liquid'}).findAll('tbody') for tr in tr_arr: lrg1 = tr.findAll('td',{'class':'txt_l'}) for tr1 in lrg1: print tr1.a.string f.close() 試したこと 上記のプログラムを動かすと作成されたCSVファイルには何も記録、保存されておりませんでした。 御教示よろしくお願いいたします!!!

みんなの回答

回答No.2

普段Python3を使っているので動く試していませんが import urllib2 from bs4 import BeautifulSoup import csv tpl_url = 'http://db.netkeiba.com/?pid=jockey_detail&id=00663&page={0}' for n in range(1, 2): url = tpl_url.format(n) html = urllib2.urlopen(url) soup = BeautifulSoup(html, 'lxml') tr = soup.select('#contents_liquid > table > tbody > tr') data = [[j.get_text().strip() for j in i.select('td.txt_l')] for i in tr] with open('horse.csv', 'wt') as fw: writer = csv.writer(fw, lineterminator='\n') writer.writerows(data) findやfindallよりもselectのほうが簡単でシンプルに書くことができます。

akakage13
質問者

お礼

python3の勉強も出来ました。 本当にありがとうございました!!!

noname#224808
noname#224808
回答No.1

見た感じcsv出力だけではなくプログラムそのものが動いていないのではないでしょうか。 エラーが出ていなければ「tr1」という文字だけ記載されているcsvファイルができると思いますが。 とりあえず f.write('tr1') は、そこではなくて for tr1 in lrg1: の下あたりでしょうね。tr1の何を出力したいのか分かりませんが、 f.write(tr1.a.string) とでもすれば、他に問題がなければ標準出力に表示されているものと同じものがcsvファイルにはき出されるはずです。

akakage13
質問者

お礼

ありがとうございました!、問題点が分かりました!!!

関連するQ&A

  • pythonでスクレイピングがうまく出来ません

    python2.7でbeautifulsoupを用いて、netkeiba.comから競馬情報(騎手の成績)をスクレイピングしています。 定法に基づきまして、『検証』からページのツリー構造を把握して、プログラムを作成しました。 馬名部分の構造が<td class="txt_l"> <a href="/horse/2011105901">テンテマリ</a></td> #テンテマリは馬名 となっておりましたので、"txt_l"を拾い出せるようにスクリプトを作りました。 しかしながら、 馬名以外の"txt_l"は全部スクレイピング出来るのですが、馬名部分だけがNoneと返ってまいります。 エラーメッセージではありませんが、何が原因でNoneとなるのかが、どうしても分かりません。 ちなみに、馬名以外で、ほぼ同様の構造を持つ、『レース名』、構造は <td class="bml txt_l"> <a href="/race/201603020812/" title="3歳上500万円下">3歳上500万円下</a> (3歳上500万円下はレース名) では、問題なくレース名を拾うことが出来ました。 該当のソースコード -*- coding:utf-8 -*- import urllib2 import codecs from bs4 import BeautifulSoup tpl_url='http://db.netkeiba.com/?pid=jockey_detail&id=00663&page={0}' for i in xrange( 1, 2 ): url=tpl_url.format( i ) soup = BeautifulSoup(urllib2.urlopen(url).read(),"lxml") tr_arr = soup.find('div', {'id':'contents_liquid'}).findAll('tbody') for tr in tr_arr: lrg1 = tr.findAll('td',{'class':'txt_l'}) for tr1 in lrg1: print tr1.string 試したこと 馬名以外の('td',{'class':'txt_l'})に準ずる『レース名』は、うまく拾うことが出来ました。 lrg1 = tr.findAll('td',{'class':'txt_l'}) で馬名を得ることが出来ない理由、併せて馬名を拾えるスクリプトを御教示くださいますよう、よろしくお願いいたします!

  • python,bs4でスクレイピング出来ません

    **お世話になります、python初心者ですpython2.7,beautifulsoupを用いて、競馬データをスクレイピングしておりますが、どうにも困っております。 1行だけはprintすることが出来るのですが、20行をスクレイピングするスクリプトと、併せて、CSVに出力させるスクリプトが分かりません。 ** 発生している問題・エラーメッセージ **csvに保存が出来ないこと 20行をまとめてスクレイピングすることが出来ないこと` ** ###該当のソースコード python2.7 -*- coding:utf-8 -*- import urllib2 import codecs from bs4 import BeautifulSoup f = codecs.open('horse.csv', 'w', 'utf-8') f.write('race_date,kaisai,weather,race_number,race_name,tousuu,frame_number,horse_number,single_win_ratio,popularity,horse_arrival,horse_name,weight,distance,baba, race_time,difference,horse_pass,pace,nobori,horse_weight,win_horse,prize_money'+ u"\n") tpl_url='http://db.netkeiba.com/?pid=jockey_detail&id=00663&page={0}' for i in xrange(1, 5): url=tpl_url.format( i ) soup = BeautifulSoup(urllib2.urlopen(url).read(),"lxml") tr_arr = soup.find('div', {'id':'contents_liquid'}).findAll('tbody') for tr in tr_arr: 日付#race_date lrg1= tr.findAll('td')[0].string 開催#kaisai lrg2= tr.findAll('td')[1].string 天気#weather lrg3= tr.findAll('td')[2].string 第○レース#race_number lrg4= tr.findAll('td')[3].string レース名#race_name lrg5= tr.findAll('td')[4].string 映像(この部分、削除したいです) lrg6= tr.findAll('td')[5].string 頭数#tousuu lrg7= tr.findAll('td')[6].string 枠番#frame_number lrg8= tr.findAll('td')[7].string 馬番#horse_number lrg9= tr.findAll('td')[8].string 単勝#single_win_racio lrg10= tr.findAll('td')[9].string 人気#popularity lrg11= tr.findAll('td')[10].string 着順#horse_arrival lrg12= tr.findAll('td')[11].string 馬名#horse_name lrg13= tr.findAll('td',{'class':'txt_l'}) [1] 斤量#weight lrg14= tr.findAll('td')[13].string 距離#distance lrg15= tr.findAll('td')[14].string 馬場#baba lrg16= tr.findAll('td')[15].string タイム#race_time lrg17= tr.findAll('td')[16].string 着差#difference lrg18= tr.findAll('td')[17].string 通過#horse_pass lrg19= tr.findAll('td')[18].string ペース#pace lrg20= tr.findAll('td')[19].string 上り#nobori lrg21= tr.findAll('td')[20].string 馬体重#horse_weight lrg22= tr.findAll('td')[21].string 勝ち馬#win_horse lrg23= tr.findAll('td',{'class':'txt_l'}) [2] 賞金#prize_money lrg24= tr.findAll('td')[23].string print lrg1,lrg2,lrg3,lrg4,lrg5,lrg6,lrg7,lrg8,lrg9,lrg10,\ lrg11,lrg12,lrg13.a.string,lrg14,lrg15,lrg16,lrg17,\ lrg18,lrg19,lrg20,lrg21,lrg22,lrg23.a.string,lrg24 f.close() (参考)下記のコードが苦慮しておりますスクレイピング対象のHTMLの 最初の1行部分でございます。 開催日毎に、これが1つのページに、20行、連続してございます。 1行しか捕らえられず、困っております。 <tbody> <tr class=""> <td><a href="/race/list/20160807/">2016/08/07</a></td> <td><a href="/race/sum/04/20160807/">2新潟4</a></td> <td>晴</td> <td class="txt_right">12</td> <td class="bml txt_l"><a href="/race/201604020412/" title="3歳上500万下">3歳上500万下</a></td> <td> <a href="/?pid=movie&amp;id=201604020412" target="_blank"><img src="/style/netkeiba.ja/image/icon_douga.png" border="0"></a> </td> <td class="txt_right">15</td> <td class="txt_right">7</td> <td class="txt_right">13</td> <td class="r3ml txt_right">6.9</td> <td class="r3ml txt_right">3</td> <td class="r2ml txt_right">2</td> <td class=" txt_l"> <a href="/horse/2013103614/">チェイスダウン</a> </td> <td>54</td> <td>ダ1200</td> <td>良</td> <td class="txt_right">1:11.9</td> <td class="txt_right">0.3</td> <td>8-8</td> <td>34.5-37.1</td> <td class="r1ml">36.6</td> <td>468(+2)</td> <td class=" txt_l"> <a href="/horse/2013101531/">クリムゾンバローズ</a> </td> <td>300.0</td> 試したこと forなどで、ループさせてみましたが、スキル不足でうまくいきませんでした。 補足情報(言語/FW/ツール等のバージョンなど) python2.7 findAllを多用して、力ずくで作ったプログラムでございます。 先輩の皆様方、御教示よろしくお願いいたします。

  • 漢字の入ったCSVファイルを読み込みたい。

    こんにちは。 python初心者の者です。 漢字の入った.csvファイルからその中の要素をリストに加えていくプログラムを作っています。 しかし、文字コードの問題からか、漢字が表示されず、困っています。 .csvファイルはexcelで作成し、.csv形式で保存しています。 以下にコードを載せるので、ご存知の方ご教授ください。 pythonは2.7 excelは2010を使っております。 【ソースコード】 import csv import codecs filename = raw_input('The file is ...') print 'Reading' + filename + '...' read_file = codecs.open(filename, 'r', 'utf-8') reader = csv.reader(read_file) list1 = [] for line in reader: list1.append(line) print list1 【.csvファイルをメモ帳で開いたイメージ】 小泉 片山 森山 田中 塩川 遠山 坂口 青木 富樫 山田

  • teraterm上でpythonを使いcsvファイルでいろいろやりたいんですが,...

    すいません。pythonを使いはじめてまだ3日のド素人の意見と思いお付き合いしてください。 pythonで、csvファイルの中にあるカラム10番目の項目にある人数を、1番目のフィールドは項目名なので読みとばして足し合わせいきたいんですが、まだ理解がぜんぜん足りなくて #!/usr/bin/env/python #!coding: utf-8   import sys,string,csv   for line in sys.stdin.readlines(): words = string.split(line, ',')   sum += string.lower(word[10])   print sum と書いて、ファイルを読み込むんですけど、うんともすんとも言わないです。 どなたかアドバイス御願いします。

  • python初心者です。csvファイルを扱いたいんですが...

    すいません、python初心者ですので、気長に聞いてくださいcsvファイルの10番目のカラムの人数を合計したんです。1行目のフィールドはカラム名なので飛ばして2行目から読み込みたいんですが、結果が出てきません。一応書いたプログラムは、 #!usr/bin/env python import sys import string i = 0 for line in open('./data.csv').readlines(): item = string.split(line,',') if item[9].isdigit(): i+=int(item[9]) print i です。処理速度を早くしたいのでdictionaly化せずに行いたいんですが、誰かご教授願えませんか?

  • csvファイルでpythonを扱いたいんですが

    以下のようなcsvファイルを使って shop,ymd,gend,age,area,amt 20,2008-05-01,3,5,014,128 22,2008-05-01,2,4,015,350 : 二列目の日別、つまりymd別に最後列のamdの小計を出したいんですが、なかなか出てくれません。以下のようなプログラムを組んだんですが #!/usr/bin/env python import csv def readcsv(filename):  L = [line[:-1] for line in file(filename).readlines()]  return map((lambda s: s.split(',')),L) csvlist = readcsv('/data/testdata/journal/j080240.csv') i=0 for line in csvlist[1:]: buydict = dict(zip(csvlist[0],line)) if buydict.itervalues('ymd'): i+=int(buydict['amt']) else: print '%s,%d'% buydict['ymd'],i i=0 とこのように書きました。もう行き詰ってきたので、質問させてもらいました。誰かご教授願えますか?

  • Python csvについて

    Python 初心者です。 Python/Djangoです。 下記のエラーを解決できなくて!! Exception Type: UnicodeEncodeError Exception Value: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) コードは: def export_excel(request): response = HttpResponse(mimetype='text/csv') response['down.csv'] = 'attachment; filename=down.csv' writer = csv.writer(response) obj_all=User.objects.all() for obj in obj_all: row=[] for field in User._meta.fields: row.append(getattr(obj,field.name)) writer.writerow(row) return response

  • pythonでjavascriptを取得したい

    検索結果を自動で取得するツールを作成しています。 ページ内のリンク先URLを取得することはできたのですが リンク先のページにjavascriptが使われていて詰まっております。 import re import pycassa import urllib import urlparse import string import urlparse import json d=urllib.urlopen("最初のページ") print d.read().decode("sjis") aa=d.readlines() d.close() for bb in aa: if(re.search('リンク先',bb)): s="http://(リンク先とつなげて表示)" url2=s+cc2 f=open(url2) data.json.load("f") f.close() print(data) 検索してJSONを使ってみたのですが良い結果にならず、 どう工夫したらよいか教えていただけないでしょうか。

  • Pythonプログラムのエラー

    こんにちは。pythonプログラムを勉強しはじめたばかりのものです。 次のプログラムが最後の行の#のところでエラーになってなかなか 解決ができません。アドバイスいただけませんでしょうか。 #! /python30/python # coding:shift_jis import sys, os, urllib, gzip def GetAndGzip(url, out): ''' urlを読み込み、gzipで圧縮してファイルoutに出力 ''' remote = urllib.urlopen(url).read() gzfile = gzip.GzipFile(filename='', mode='web', fileobj=out) gzfile.write(remote) gzfile.colse() #パラメータを抽出 if len(sys.argv) <> 2: print '使い方:python wgetgz.py url' else: url = sys.argv[1] GetAndGzip(url, sys.stdout) #ここでエラーin<module> #ここで投稿すると、インデントがなくなってしまうようです。

  • pythonで日本語csvからデータを読み込みたい

    python初心者です。 mac上で、csvファイルからデータを読み込んでデータベースを作りたいのですが… csvの中身は、例えば ID, 名字,名前, 年齢, 出身地 1, 山田, 太郎, 30, 大阪 2, 田中, 和夫, 55, 千葉 ... のような、極めてシンプルな感じです。 色々調べて、エンコードの問題があることは理解しましたが、web上の解決策を試してもなぜかうまく行きません。(python2.7です。) #coding:utf-8 import csv inputfile = open(u'data.csv', 'rU') reader = csv.DictReader(inputfile) for r in reader: print r とすると、1行ずつ読み込めてはいますが、printしたときの日本語が読めません。 どうすれば良いのでしょうか? また、読めないですが、プログラム内でデータのやり取りをする分には問題ないのでしょうか? (例えば、1番とX番の出身地が同じ、の判定をするとか) 非常に基本的な問題だと思うのですが、sqlでデータベースを作る前のこの段階で躓いて、全然前に進めずにいます(>_<) どうか教えて下さい、宜しくお願いします。

専門家に質問してみよう