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

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

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

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

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

Q&A

解決済

1回答

1237閲覧

【スクレイピング】Scrapyのyieldで格納した変数をタプルで返してファイルに出力したい

mbase

総合スコア17

Python

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

Scrapy

Scrapyは、Pythonで開発されたオープンソースソフトウェアです。スクレイピングという、Webサービスから必要な情報を取り出したり自動操作をしたりする技術を使うものです。

0グッド

0クリップ

投稿2019/03/12 09:11

編集2019/03/12 09:12

PythonでScrapyをしております。

芥川賞について、作者・書名・掲載誌を1つの情報にまとめたいと考えております。

スクレイピングしたいURLは以下のサイトです。

http://www.bunshun.co.jp/shinkoukai/award/akutagawa/list.html

以下のコードを書きました(おそらくかなり無駄なfor文を書いていると思います…)。

python

1# -*- coding: utf-8 -*- 2import scrapy 3 4 5class AkutagawaSpider(scrapy.Spider): 6 name = 'akutagawa' 7 allowed_domains = ['www.bunshun.co.jp'] 8 start_urls = ['http://www.bunshun.co.jp/shinkoukai/award/akutagawa/list.html'] 9 10 def parse(self, response): 11 for akutagawa in response.css('div.tab-content'): 12 13 # 著者名のリストを取得 14 names = [] 15 names += akutagawa.css('div.tab-pane dl dd span.name::text')[1:].extract() 16 17 for name in names: 18 name = name 19 20 21 # 書名のリストを取得 22 titles = [] 23 titles += akutagawa.css('div.tab-pane dl dd span.title::text')[1:].extract() 24 25 for title in titles: 26 title = title 27 28 29 # 雑誌名のリストを取得 30 magazines = [] 31 magazines += akutagawa.css('div.tab-pane dl dd span.magazine::text')[1:].extract() 32 33 for magazine in magazines: 34 magazine = magazine 35 36 37 38 yield{ 39 'name': name, 40 'title': title, 41 'magazine': magazine, 42 }

name, title, magazineに入れた変数を使って、最後の yield で{著者名, 書名, 掲載誌}という情報をすべて抜き出したいと考えております。

実行結果は以下のとおり、最後の情報1つしかしか抜き出せません。おそらく for文 の過程でデータが上書きされてしまっているのだと思います。

{'name': '石川達三', 'title': '蒼氓', 'magazine': '星座'}

芥川賞作家すべての情報を上記のタプルで抜き出したいです。

names, titles, magazinesのリストには各データがすべて入っているのですが、それを一つずつのタプルにまとめる方法が知りたいです。

最終的にはすべてをファイルに出力してデータとして使うつもりです。

何卒、よろしくお願いします。

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

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

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

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

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

t_obara

2019/03/12 10:39

まずは、三つではなくnamesだけでも所望の動作をするようにしてみてはいかがですか?forの内部でnamesに入れていますが、yeildにするにはforの外側でnamesをforで一つずつ取り出す必要があるのでは?
mbase

2019/03/12 14:00

namesだけで試したところ、上手く出力できました。ありがとうございます!
guest

回答1

0

ベストアンサー

tupleではなくdictではないでしょうか。それはいいんですが。

いまいち自信がないですが、たぶんこういうことだろうと山勘で回答。

python

1 def parse(self, response): 2 for akutagawa in response.css('div.tab-content'): 3 names akutagawa.css('div.tab-pane dl dd span.name::text')[1:].extract() 4 titles = akutagawa.css('div.tab-pane dl dd span.title::text')[1:].extract() 5 magazines = akutagawa.css('div.tab-pane dl dd span.magazine::text')[1:].extract() 6 7 for name, title, magazine in zip(names, titles, magazines): 8 yield {'name': name, 9 'title': title, 10 'magazine': magazine}

投稿2019/03/12 13:50

hayataka2049

総合スコア30933

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

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

mbase

2019/03/12 14:00

ありがとうございます。無事に出力できました。 for文で複数の変数を入れるときは zip(names, titles, magazines): という書き方をするんですね。勉強になりました!
hayataka2049

2019/03/12 14:08

念の為に書いておくと、zipそのものはfor文に付随する構文などではなく、ただの組み込みクラスです。どういう役割なのかはご自身で調べていただければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問