2016-09-29 1 views
0

このプロジェクトでは、データベースからデータをスクラップし、このデータをスプレッドシートにエクスポートしてさらに分析することを試みています。BeautifulSoupをCSVにエクスポートします。スクラップ+列にイメージ値を含める

私のコードはほとんどの場合うまく機能しているようですが、最後のビットになると、CSVにエクスポートされます。私は運がないです。この質問は何度か尋ねられましたが、回答はさまざまなアプローチに合わせているようですが、私はその答えに順応する運を持っていませんでした。

私のコードは以下の通りです:

from bs4 import BeautifulSoup 
import requests 
import re 
url1 = "http://www.elections.ca/WPAPPS/WPR/EN/NC?province=-1&distyear=2013&district=-1&party=-1&pageno=" 
url2 = "&totalpages=55&totalcount=1368&secondaryaction=prev25" 

date1 = [] 
date2 = [] 
date3 = [] 
party=[] 
riding=[] 
candidate=[] 
winning=[] 
number=[] 

for i in range(1, 56): 
    r = requests.get(url1 + str(i) + url2) 
    data = r.text 
    cat = BeautifulSoup(data) 
    links = [] 
    for link in cat.find_all('a', href=re.compile('selectedid=')): 
     links.append("http://www.elections.ca" + link.get('href')) 
    for link in links: 
     r = requests.get(link) 
     data = r.text 
     cat = BeautifulSoup(data) 
     date1.append(cat.find_all('span')[2].contents) 
     date2.append(cat.find_all('span')[3].contents) 
     date3.append(cat.find_all('span')[5].contents) 
     party.append(re.sub("[\n\r/]", "", cat.find("legend").contents[2]).strip()) 
     riding.append(re.sub("[\n\r/]", "", cat.find_all('div', class_="group")[2].contents[2]).strip()) 
     cs= cat.find_all("table")[0].find_all("td", headers="name/1")   
     elected=[] 
     for c in cs: 
      elected.append(c.contents[0].strip()) 
     number.append(len(elected)) 
     candidate.append(elected) 
     winning.append(cs[0].contents[0].strip()) 


import csv 

file = "" 

for i in range(0,len(date1)): 
    file = [file,date1[i],date2[i],date3[i],party[i],riding[i],"\n"] 

with open ('filename.csv','rb') as file: 
    writer=csv.writer(file) 
    for row in file: 
     writer.writerow(row) 

本当に - 任意のヒントをいただければ幸いです。どうもありがとう。

*第2部:もう一つの質問:「優勝者」が常に最初に登場したと思ったので、テーブルに表示される最初の名前を選択するだけで、しかし、そうではありません。 候補が選出されたかどうかは、最初の列に画像形式で格納されます。どのように私はこれを掻き集めてスプレッドシートに保存するのですか? それは次のように> < TD見出しの下に位置しています:

< img src="/WPAPPS/WPR/Content/Images/selected_box.gif" alt="contestant won this nomination contest" > 

私はブールソート尺度のいくつかの並べ替えをしようとするためのアイデアを持っていたが、私は実装する方法がわからないと思います。ありがとうございます* 更新:この質問は別の投稿hereになりました。

+0

あなたは現在 'open( 'filename.csv'、 'rb')'を持っていますので、ファイルを 'open( 'filename.csv'、 'wb')'として書くべきです。 –

答えて

1

正しくCSVファイルにデータをエクスポートする必要があり、次の

from bs4 import BeautifulSoup 
import requests 
import re 
import csv 


url = "http://www.elections.ca/WPAPPS/WPR/EN/NC?province=-1&distyear=2013&district=-1&party=-1&pageno={}&totalpages=55&totalcount=1368&secondaryaction=prev25" 
rows = [] 

for i in range(1, 56): 
    print(i) 
    r = requests.get(url.format(i)) 
    data = r.text 
    cat = BeautifulSoup(data, "html.parser") 
    links = [] 

    for link in cat.find_all('a', href=re.compile('selectedid=')): 
     links.append("http://www.elections.ca" + link.get('href')) 

    for link in links: 
     r = requests.get(link) 
     data = r.text 
     cat = BeautifulSoup(data, "html.parser") 
     lspans = cat.find_all('span') 
     cs = cat.find_all("table")[0].find_all("td", headers="name/1")   
     elected = [] 

     for c in cs: 
      elected.append(c.contents[0].strip()) 

     rows.append([ 
      lspans[2].contents[0], 
      lspans[3].contents[0], 
      lspans[5].contents[0], 
      re.sub("[\n\r/]", "", cat.find("legend").contents[2]).strip(), 
      re.sub("[\n\r/]", "", cat.find_all('div', class_="group")[2].contents[2]).strip().encode('latin-1'), 
      len(elected), 
      cs[0].contents[0].strip().encode('latin-1') 
      ]) 

with open('filename.csv', 'w', newline='') as f_output: 
    csv_output = csv.writer(f_output) 
    csv_output.writerows(rows) 

CSVファイルにあなたの出力の以下のようなものを与える:多くを構築する必要はありません

"September 17, 2016","September 13, 2016","September 17, 2016",Liberal,Medicine Hat--Cardston--Warner,1,Stanley Sakamoto 
"June 25, 2016","May 12, 2016","June 25, 2016",Conservative,Medicine Hat--Cardston--Warner,6,Brian Benoit 
"September 28, 2015","September 28, 2015","September 28, 2015",Liberal,Cowichan--Malahat--Langford,1,Luke Krayenhoff 

あなたのデータの各列の別々のリストのうち、rowsのリストを直接作成するほうが簡単です。これは、一度にCSVに書き込むことができます(または、データを収集する際に一度に行を書き込むこともできます)。

+0

ありがとう!非常にうまくいった。 私は3.5で作業していると言わざるを得ないので、open( 'filename.csv'、 'wb')//を//( 'filename.csv'、 'w')//に変更しました。私が得たタイプのエラー。本当に応答を感謝します! – HowenWilson

+0

パート2の意見はありますか?それは別のスレッドの方が適切でしょうか? – HowenWilson

+0

Python 3では、 'newline = '''を使ってファイルを開く必要があります。私はスクリプトを更新しました。別の質問がうまくいくかもしれませんが、コードの最小行数に問題を減らすことをお勧めします。 –

関連する問題