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

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

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

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

Scrapy

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

Q&A

0回答

746閲覧

【スクレイピング】Scrapyで特定のタグあるいは文字列を除いたデータを取得したい

mbase

総合スコア17

Python

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

Scrapy

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

0グッド

0クリップ

投稿2019/03/13 02:34

編集2019/03/13 02:38

芥川賞の受賞者データをまとめるために、スクレイピングで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要素を取り出せれば上手くいくのかな?と思いました。

あるいは正規表現なども考えたのですが、なにかスマートな取得方法がおわかりでしたら教えてください。

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

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

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

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

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

t_obara

2019/03/13 07:51

本来dtに関する説明をddで行うような構造になるべきで、ヘッダであれば、それをなんらかの手段で分けるべきかと思いますが、元のサイトを見ると、最初に現れたdtやddをヘッダと見なすようにしているので、取得する方も先頭以外と言う抽出方法を利用すれば良いのではないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問