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

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

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

Q&A

解決済

2回答

395閲覧

for文の中でcsvを作成するとエラーが出ます。何を見落としているでしょうか?

like_kinesis

総合スコア8

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

0グッド

0クリップ

投稿2019/02/28 03:07

編集2019/02/28 03:31

python3
BeautifulSoup

【行いたいこと】
BeautifulSoupでループを回し、ループごとにCSVを作成したいです。
wモードなので、ファイルが存在しなければ作る、だと認識しています。
for文の中だとファイルが存在しません、となって止まってしまいます。

【エラー内容】
with open('{}.csv'.format(file_name), 'w') as f:
FileNotFoundError: [Errno 2] No such file or directory:

【各コード】
問題を切り分けるために、全く同じコードをfor文のループの外に出すと作成されました。

【行ったこと】
文字コードのチェック⇛UTF-8
CSVのタイトルになる変数の型⇛string

コードをシンプルにした所、シンプルなfor文だと作成出来るので
BeautifulSoupの扱いがまずいのかなと思ってはいます。

何を見落としているか教えていただきたいです
これから先どう切り分けていけばいいか教えて頂きたいです。

よろしくお願い致します

python

1#_*_ coding: utf-8 _*_ 2import urllib.request, urllib.error 3import re 4import csv 5import os 6 7from bs4 import BeautifulSoup 8from pprint import pprint 9 10#+----------------関数ゾーン----------------+ 11 12#csvを作る関数 13def save_to_csv(executions, file_name): 14 """ 15 :param executions:約定履歴の2次元配列 16 :return: 17 """ 18 with open('{}.csv'.format(file_name), 'a') as f: 19 writer = csv.writer(f, lineterminator='\n')#改行コードの指定 20 writer.writerows(executions) #list型の場合はこれでOk,2次元配列の場合はコレでもOk 21 22 23#urlを投げてスープで返す関数 24def get_soup(url): 25 target = url 26 27 # URLにアクセスする htmlが帰ってくる → <html><head><title>経済、株価、ビジネス、政治のニュース:日経電子版</title></head><body.... 28 source = urllib.request.urlopen(target) 29 30 # htmlをBeautifulSoupで扱う 31 soup = BeautifulSoup(source, "lxml") 32 return soup 33 34#+----------------関数ゾーン_fin-------------+ 35 36top_url = 'https://hogehoge.com' 37 38top = get_soup(top_url) 39 40#疑似要素を取れないので近くの要素を取得してよしなに。 41blocks = top.select('css_selector') #ブログカードの取得 42 43#配列のための用意 44i = 0 45first_result = [ 'url' , 'title' , 'midashi' , 'midasi_moji' , 'body' ] 46 47for block in blocks: 48 #topページから記事ページとURLを取得 49 i = i +1 50 print(block) 51 52 href = block.find("a").attrs['href'].strip().rstrip()#URL取得 53 title = block.find("h3").string.strip().rstrip() #タイトル取得 54 55 print(i) 56 print("回目") 57 print( title , ">" , href ) 58 59 #topページから記事ページとURLを取得_ここまで 60 61 page = get_soup(href) 62 63 page_soup = page.select_one('#nocopy > div') 64 65 text = '' 66 67 file_name = top_url + "_" + title 68 69 print('sakusei_mae') 70 71 #ヘッダーの書き込み_なければ書き込み 72 with open('{}.csv'.format(file_name), 'w') as f: 73 writer = csv.writer(f, lineterminator='\n') 74 writer.writerow(["title","body","str_len",href]) 75 76 print('sakusei_go') 77 78 for tag in page_soup.find_all(): 79 if re.match(r'h\d$', tag.name): 80 # h1, h2, ..., h6 タグが見つかった場合、それ以前の文字数を出力する。_logファイルを作成する 81 print('{} ,{}, {}'.format(text, len(text), tag.text)) 82 83 csv_ready = [text,len()] 84 text = '' 85 save_to_csv(csv_ready, file_name) 86 87 elif tag.string: 88 # h1, h2, ..., h6 タグ以外で値を持つタグの場合 89 text += tag.string 90 91 csv_ready = '' 92 93

またソースコードをなるべくシンプルにしたとこと、下記内容では全てCSV作成が成功しました。

python

1#_*_ coding: utf-8 _*_ 2import urllib.request, urllib.error 3import re 4import csv 5import os 6 7from bs4 import BeautifulSoup 8from pprint import pprint 9 10 11#+----------------関数ゾーン----------------+ 12 13#csvを作る関数 14def save_to_csv(executions, file_name): 15 """ 16 :param executions:約定履歴の2次元配列 17 :return: 18 """ 19 with open('{}.csv'.format(file_name), 'a') as f: 20 writer = csv.writer(f, lineterminator='\n')#改行コードの指定 21 writer.writerows(executions) #list型の場合はこれでOk,2次元配列の場合はコレでもOk 22 23#+----------------関数ゾーン_fin-------------+ 24 25 26file_name = 'loop_no_ue' 27href = "href_test" 28 29 30with open('{}.csv'.format(file_name), 'w') as f: 31 writer = csv.writer(f, lineterminator='\n') 32 writer.writerow(["title","body","str_len",href]) 33#作成成功 34 35 36for i in range(5): 37 38 #topページから記事ページとURLを取得_ここまで 39 40 file_name = str(i) + "回目のテスト" 41 42 #ヘッダーの書き込み_なければ書き込み 43 with open('{}.csv'.format(file_name), 'w') as f: 44 writer = csv.writer(f, lineterminator='\n') 45 writer.writerow(["title","body","str_len",href]) 46 #作成成功 47 48 49file_name = "loop_no_shita" 50href = "href_test" 51file_name = 'loop_soto' 52 53with open('{}.csv'.format(file_name), 'w') as f: 54 writer = csv.writer(f, lineterminator='\n') 55 writer.writerow(["title","body","str_len",href]) 56#作成成功

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

with open('{}.csv'.format(file_name), 'w') as f:

FileNotFoundError: [Errno 2] No such file or directory:

そういうファイルがない、と言ってるんですから、実際にどういうファイルをアクセスしに行ってるのか、ここで生成したファイル名をどこかに出してみたらどうでしょうか。

投稿2019/02/28 03:12

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

file_name/が入ると駄目です。ディレクトリ階層を表すとみなされます。ファイルは勝手に作ってくれますが、ディレクトリまでは掘ってくれないのです。

URLをファイル名の一部に使おうとしているので問題になっているのでしょう。

そもそも論ですが、ファイル名に使えない文字がいろいろあるので、そのへんにご注意を。

投稿2019/02/28 03:12

編集2019/02/28 03:29
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

like_kinesis

2019/02/28 03:29

完全に盲点でした。 ありがとうございます!少し検証していきます。
like_kinesis

2019/02/28 04:42

ありがとうございました。解決致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問