芥川賞の受賞者データをまとめるために、スクレイピングでScrapyを使っています。
特定のタグおよびクラスに入った文字列を取得したいと考えています。
まず、対象のHTMLは以下のとおりです。
HTML
1<div id="no8" class="tab-pane fade"> 2 <dl> 3 <dt><span class="no">回</span><span class="year">受賞年</span></dt><dd><span class="name">受賞者</span><span class="title head">受賞作</span><span class="magazine ">掲載誌</span></dd> 4 5 <dt><span class="no">159</span><span class="year">2018上</span></dt><dd><span class="name">高橋弘希</span><span class="title">送り火</span><span class="magazine ">文學界</span></dd> 6 <dt><span class="no">158</span><span class="year">2017下</span></dt><dd><span class="name">石井遊佳</span><span class="title">百年泥</span><span class="magazine ">新潮</span></dd> 7 <dt><span class="no">158</span><span class="year">2017下</span></dt><dd><span class="name">若竹千佐子</span><span class="title">おらおらでひとりいぐも</span><span class="magazine ">文藝</span></dd> 8 <dt><span class="no">157</span><span class="year">2017上</span></dt><dd><span class="name">沼田真佑</span><span class="title">影裏<span class="small">(えいり)</span></span><span class="magazine ">文學界</span></dd> 9 <dt><span class="no">156</span><span class="year">2016下</span></dt><dd><span class="name">山下澄人</span><span class="title">しんせかい</span><span class="magazine ">新潮</span></dd> 10 <dt><span class="no">155</span><span class="year">2016上</span></dt><dd><span class="name">村田沙耶香</span><span class="title">コンビニ人間</span><span class="magazine ">文學界</span></dd> 11 <dt><span class="no">154</span><span class="year">2015下</span></dt><dd><span class="name">本谷有希子</span><span class="title">異類婚姻譚<span class="small">(いるいこんいんたん)</span></span><span class="magazine ">群像</span></dd> 12 <dt><span class="no">154</span><span class="year">2015下</span></dt><dd><span class="name">滝口悠生</span><span class="title">死んでいない者</span><span class="magazine ">文學界</span></dd> 13 <dt><span class="no">153</span><span class="year">2015上</span></dt><dd><span class="name">又吉直樹</span><span class="title">火花</span><span class="magazine ">文學界</span></dd> 14 <dt><span class="no">153</span><span class="year">2015上</span></dt><dd><span class="name">羽田圭介</span><span class="title">スクラップ・アンド・ビルド</span><span class="magazine ">文學界</span></dd> 15 <dt><span class="no">152</span><span class="year">2014下</span></dt><dd><span class="name">小野正嗣</span><span class="title">九年前の祈り</span><span class="magazine ">群像</span></dd> 16 <dt><span class="no">151</span><span class="year">2014上</span></dt><dd><span class="name">柴崎友香</span><span class="title">春の庭</span><span class="magazine ">文學界</span></dd> 17 <dt><span class="no">150</span><span class="year">2013下</span></dt><dd><span class="name">小山田浩子</span><span class="title">穴</span><span class="magazine ">新潮</span></dd> 18 <dt><span class="no">149</span><span class="year">2013上</span></dt><dd><span class="name">藤野可織</span><span class="title">爪と目</span><span class="magazine ">新潮</span></dd> 19 <dt><span class="no">148</span><span class="year">2012下</span></dt><dd><span class="name">黒田夏子</span><span class="title">abさんご</span><span class="magazine ">早稲田文学</span></dd> 20 <dt><span class="no">147</span><span class="year">2012上</span></dt><dd><span class="name">鹿島田真希</span><span class="title">冥土めぐり</span><span class="magazine ">文藝</span></dd> 21 <dt><span class="no">146</span><span class="year">2011下</span></dt><dd><span class="name">田中慎弥</span><span class="title">共喰い</span><span class="magazine ">すばる</span></dd> 22 <dt><span class="no">146</span><span class="year">2011下</span></dt><dd><span class="name">円城塔</span><span class="title">道化師の蝶</span><span class="magazine ">群像</span></dd> 23 <dt><span class="no">145</span><span class="year">2011上</span></dt><dd><span class="name">なし</span></dd> 24 <dt><span class="no">144</span><span class="year">2010下</span></dt><dd><span class="name">西村賢太</span><span class="title">苦役列車</span><span class="magazine ">新潮</span></dd> 25 <dt><span class="no">144</span><span class="year">2010下</span></dt><dd><span class="name">朝吹真理子</span><span class="title">きことわ</span><span class="magazine ">新潮</span></dd> 26 <dt><span class="no">143</span><span class="year">2010上</span></dt><dd><span class="name">赤染晶子</span><span class="title">乙女の密告</span><span class="magazine ">新潮</span></dd> 27 <dt><span class="no">142</span><span class="year">2009下</span></dt><dd><span class="name">なし</span></dd> 28 <dt><span class="no">141</span><span class="year">2009上</span></dt><dd><span class="name">磯崎憲一郎</span><span class="title">終の住処</span><span class="magazine ">新潮</span></dd> 29 <dt><span class="no">140</span><span class="year">2008下</span></dt><dd><span class="name">津村記久子</span><span class="title">ポトスライムの舟</span><span class="magazine ">群像</span></dd> 30 </dl> 31 </div> 32
このうち、受賞者名、受賞作、掲載誌のデータを抜き出すために、class="name" class="title" class="magazine を指定して以下のコードを準備しました。
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 11 def parse(self, response): 12 13 for akutagawa in response.css('div.tab-content'): 14 15 # 著者名を取得 16 names = akutagawa.css('div.tab-pane dl dd span.name::text')[1:].extract() 17 18 # 書名を取得 19 titles = akutagawa.css('div.tab-pane dl dd span.title::text')[1:].extract() 20 21 # 雑誌名を取得 22 magazines = akutagawa.css('div.tab-pane dl dd span.magazine::text')[1:].extract() 23 24 # 著者名、書名、雑誌名が入ったイテラブルを1つずつ変数に入れて出力 25 for name, title, magazine in zip(names, titles, magazines): 26 yield { 'name': name, 27 'title': title, 28 'magazine': magazine} 29
これで著者名、書名、掲載誌は取得できるのですが、カラム名の
<span class="name">受賞者</span><span class="title head">受賞作</span><span class="magazine ">掲載誌</span>
がデータに混ざってしまいます。これは、このカラム名と各データの class が同じ名前であることが原因です。
上記のカラム名を除いてデータを取得することは可能でしょうか?
自分で考えた限りだと、 dl要素内の2つめ以降のdd要素を取り出せれば上手くいくのかな?と思いました。
あるいは正規表現なども考えたのですが、なにかスマートな取得方法がおわかりでしたら教えてください。
あなたの回答
tips
プレビュー