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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2561閲覧

beautifulsoupでスクレイピングしたデータの格納(ヘッダーにあわせて格納したい)

A.Kobayashi

総合スコア13

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/11/08 01:47

編集2017/11/09 00:23

###前提・実現したいこと
スクレイピングしたデータをヘッダーに合わせて格納したい

###発生している問題・エラーメッセージ
ヘッダーA,B摘出要素a1,a2,b1,b2に対して
A B
a1
a2
b1
b2
となっているのを

A B
a1 b1
a2 b2

として出力したいです。
プログラミング初心者すぎて困っています。

###該当のソースコード
python

# -*- coding: utf-8 -*- import csv import requests from bs4 import BeautifulSoup f = open('output.csv', 'w', newline='') #アクセスするURL url検索 line = ["https://r.nikkei.com/search?keyword=経済","https://r.nikkei.com/search?keyword=株価"] # ヘッダ書き込み f.write('経済,株価\n') for url in line: r = requests.get(url) # スクレイピング抽出要素を指定 soup = BeautifulSoup(r.text, 'lxml') for list in soup.find_all('a' , class_='nui-card__meta-pubdate'): nlist = list.get('href') # データをリストに保持 csvlist = {nlist} # 出力 writer = csv.writer(f, lineterminator='\n') writer.writerow(csvlist) f.write(',') # ファイルクローズ f.close()
###試したこと poko_pokoさんご回答ありがとうございます、試してみたのですがうまくいきませんでした… ###補足情報(言語/FW/ツール等のバージョンなど) python3.6 beautifulsoup4.6.0

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

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

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

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

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

LouiS0616

2017/11/08 09:05

インデントが崩れてコードを読めないです。編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
guest

回答2

0

ベストアンサー

期待する出力結果は以下でしょうか。

経済株価
経済のhref1株価のhref1
経済のhref2株価のhref2

外側のループでは列方向に経済、株価の順にデータ取得しているので、2列目の株価の列データを取るまで行を出力することができません。つまり、経済と株価のデータを貯めたあとに出力する必要があります。

以下のような流れでできます。(ややソースを改変しています。)

Python

1import csv 2import requests 3from bs4 import BeautifulSoup 4 5keywords = ['経済','株価'] 6cols = [] # 経済と株価 の列リストを保持 7for kw in keywords: # 経済と株価 8 url = "https://r.nikkei.com/search?keyword=" + kw; 9 10 col = [] # 1列分のリスト 11 r = requests.get(url) 12 soup = BeautifulSoup(r.text, 'lxml') 13 for l in soup.find_all('a' , class_='nui-card__meta-pubdate'): 14 nlist = l.get('href') # URL 15 col.append(nlist) # 16 17 cols.append(col) # 列全体を追加 18 19# 全列を行(タプル)に展開 20for line in zip(*cols): # = for c1,c2 in zip(cols[0],cols[1]): 21 print(line)

投稿2017/11/09 01:40

can110

総合スコア38262

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

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

A.Kobayashi

2017/11/09 01:44

無事できました、ありがとうございます!
guest

0

多分で申し訳ありませんが、list.getの部分で1行ずつ入力していっているからでは無いでしょうか。
かなり適当ですが、流れで言うとこんな感じになるのでは無いかと思います。

やりたいこと「A1,B1\n の1行のwriteを繰り返す」 count = 0 for list in soup.find_all('a' , class_='nui-card__meta-pubdate'): count += 1 nlist = nlist + list.get('href') if(count == 1): nlist = nlist + ',' if(count == 2): f.write(nlist + '\n') nlist = '' count = 0 f.close()

投稿2017/11/08 09:44

poko_poko

総合スコア168

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

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

LouiS0616

2017/11/09 06:03 編集

イテレータの性質を利用した方がきれいだと思いますよ。 tmp_iter = iter(soup.find........) for i, j in zip(tmp_iter, tmp_iter): ......
poko_poko

2017/11/09 10:40

いつもrangeでぶん回してイテレータ使ってませんでした…… これを気に使い方勉強します。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問