質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.37%

  • Python 3.x

    8523questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

【openpyxl】forループで得たリスト全てを、csvに書き出す方法

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,015

KimuraChica

score 4

 前提・実現したいこと

openpyxlを利用し、beautiifulsoupで抽出した情報を
csvに一列に落としたいと考えています。

 発生している問題・エラーメッセージ

beautifulsoupで抽出した情報を全てcsvに落としたいのですが、
forループの一番最後の処理のみがcsvに落とされます。
(処理をする際、どんどん上書かれているような…?)

 該当のソースコード

# BeautifulSoup
import urllib.request
from bs4 import BeautifulSoup

html = urllib.request.urlopen("http://ecodb.net/area/")
soup = BeautifulSoup(html, "html.parser")
div = soup.find("div", class_="access")
hrefList = div.find_all("a")

# openpyxl
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "title"

for url in reversed(list(hrefList)):
    hrefList = []
    hrefList.append(url['href'])
    for i in range(0,len(hrefList)):
        s='B'+str(i+2)
        ws[s]=hrefList[i]

wb.save('csvname.csv')

 参考

参考にしたのはこちらのサイトです。
http://www.nurse-scheduling-software.com/tutorial/excel_operation_by_python.htm

一番最後のforループに不安要素があるのですが、ガンはそこでしょうか…?それともそれ以前の問題なのでしょうか。
どのように書いたら全てのリストが一列に出力されるか、ご存知の方いらっしゃいましたらご教示ください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

csv.py

# BeautifulSoup
import urllib.request
from bs4 import BeautifulSoup

html = urllib.request.urlopen("http://ecodb.net/area/")
soup = BeautifulSoup(html, "html.parser")
div = soup.find("div", class_="access")
hrefList = div.find_all("a")

# openpyxl
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
ws.title = "title"

row = 2
for url in reversed(list(hrefList)):
    hrefList = []
    hrefList.append(url['href'])
    for i in range(0, len(hrefList)):
        s = 'B' + str(row)
        row += 1
        ws[s] = hrefList[i]
        # print(s)
        # print(hrefList[i])

wb.save('csvname.xlsx')

質問文にあるコードは csv 形式ではなく、 エクセルファイルを生成しています。
出力ファイルの拡張子を .xlsx に変更しました。

ループの中で s と hrefList[i] を print して、情報が得られているかを確認してみました。
すると、 s の値がいつも B2 であることがわかりました。
そこで、 s がB2, B3, ... と変化するように 変数 row を加えて処理を少し変更しました。
実行させて生成された  csvname.xlsx を エクセルで開いたときのスクリーンショットを示します。

イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/05 00:39

    こんなに丁寧に…!本当にありがとうございます。うまくいきました。

    # print(s)
    # print(hrefList[i])
    を残しておいてくださったお気遣いに感謝いたします。

    キャンセル

0

forループの中でhrefListを初期化してしまっているのがまずいのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/04 21:56

    コメントありがとうございます!

    hrefList = []
    の部分ですよね。
    試しにコメントアウトして実行してみたところ、
    ValueError: Cannot convert
    というエラーが出ました。

    for url in reversed(list(hrefList)):
    の直前に置いてみたりもしたのですが₍とんちんかんかもしれませんが)
    csvには何も出力されませんでした。悩み中です。。

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    8523questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。