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

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

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

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

1048閲覧

URLのスクレイピング:対象がNoneTypeでスクレイピングできない

kenken0023

総合スコア15

Python

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2018/11/15 05:30

前提・実現したいこと

pythonのCSSセレクタを用いて旅行サイトよりイベント名、「期間」、「場所」の3項目をスクレイピングしたい。

発生している問題・現在の出力内容

pythonでURLの情報をスクレイピングしようとしているのですが、対象の型がNoneTypeでスクレイピングできない。

旅行サイトよりイベント名、期間、場所の3項目をスクレイピングしようとしており、イベント名まではスクレイピング出来たのですが、例えば「期間:11月25日」と書いているようなものをスクレイピングしようとした時、NoneTypeと表示されスクレイピングできない

現在の出力内容 .... じゃらん PRODUCED BY RECRUIT > //www.jalan.net None > https://golf-jalan.net/?vos=cpjgfprocap0121113001 第8回大阪マラソン〜OSAKA MARATHON 2018〜 > //www.jalan.net/event/evt_224744/ ドイツ・クリスマスマーケット大阪 > //www.jalan.net/event/evt_227109/ 大阪・光の饗宴2018 OSAKA光のルネサンス2018 > //www.jalan.net/event/evt_228820/ 大阪・光の饗宴2018 御堂筋イルミネーション2018 > //www.jalan.net/event/evt_227312/ 大阪天満宮 初詣 > //www.jalan.net/event/evt_229995/ 住吉大社 初詣 > //www.jalan.net/event/evt_229997/ 今宮戎神社 十日戎 > //www.jalan.net/event/evt_229986/ 初天神梅花祭 > //www.jalan.net/event/evt_229991/ ....

該当のソースコード

pyhton

1from bs4 import BeautifulSoup 2import urllib.request as req 3 4url = "https://www.jalan.net/event/270000/" 5res = req.urlopen(url) 6soup = BeautifulSoup(res, "html.parser") 7 8li_list = soup.select("div p")#divより下のクラスpをセレクト 9 10for li in li_list: #URL内liに含まれるli_list回るまでループ、ループする範囲を広げてては? 11 a = li.a 12 #checka = type(a) 13 #print(checka) 14 if a != None: 15 name = a.string 16 href = a.attrs["href"] 17 print(name, ">", href) 18 19 dl_list = soup.select("dl dd") 20 dd = li.dd 21 #check = type(dd) 22 #print(check) 23 if dd != None: 24 name1 = dd.string 25 print(name1) 26

試したこと

対象がスクレイピング出来なかったため、type()で型を調べたところNoneTypeと返ってきた。

補足情報(FW/ツールのバージョンなど)

スクレイピングするURL:https://www.jalan.net/event/270000/

(例)
...
大阪マラソン2018 (イベント名 スクレイピング成功済み)
期間:11月25日 (NoneTypeと表示された)
場所:大阪市 大阪城公園前 (NoneTypeと表示された)
...

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

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

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

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

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

tabuu

2018/11/15 05:55

「dl dd」は「div p」の中に無いからではないでしょうか。
kenken0023

2018/11/15 15:24

すみません、その部分はまだ不完全で目的通りに動くようにはなっていません。大きなクラスdivの中に子クラスがあり、pとdlは同じクラスです。セレクタでpからdlの終わりまでを指定してスクレイピング出来ればいいと思っているのですが。
tabuu

2018/11/15 23:30

BeautifulSoupは使ったことが無いので概念だけですが、idが"cassetteType"のulをループさせて、classが"item"のliを取得する、そのliの中のclassが"item-eventInfo"のdlの中に期間や場所が入っているので、正規表現で取得する、という方法で可能そうです。
guest

回答1

0

ベストアンサー

Python3 Webスクレイピングの実践入門
https://imabari.hateblo.jp/entry/2017/11/07/010010

こちらのページを参考にしてください

タイトルのCSSセレクタを取得、上から3つぐらい取得しパターンを分析

#cassetteType > li:nth-child(1) > div > div.item-info > p.item-name.rank-ico-01 > a #cassetteType > li:nth-child(2) > div > div.item-info > p.item-name.rank-ico-02 > a #cassetteType > li:nth-child(3) > div > div.item-info > p.item-name.rank-ico-03 > a

li:nth-child(1)
li:nth-child(2)
li:nth-child(3)
と数字が増えていくのでイベント単位だと分析

セレクタ名は省略されるので確認
イメージ説明

#cassetteType > li.item

イベントごとに抽出できます。

残りの

div > div.item-info > p.item-name.rank-ico-01 > a

html

1<p class="item-name rank-ico-01"> 2 <span style="display: none;">1</span><a href="//www.jalan.net/event/evt_224744/" onclick="javascript:ouComLink('/event/evt_224744/','myForm');return false;">第8回大阪マラソン~OSAKA MARATHON 2018~</a> 3 </p>

クラス名が複数あるだけなので変更のない「item-name」を指定するとタイトルが抽出できます

p.item-name > a

期間と場所も同じようにするとできます。
chromeでは「nth-child」になっていますがbeautifulsoupだと「nth-of-type」になります。

python

1import requests 2from bs4 import BeautifulSoup 3 4url = 'https://www.jalan.net/event/270000/' 5 6r = requests.get(url) 7 8if r.status_code == requests.codes.ok: 9 10 soup = BeautifulSoup(r.content, 'html.parser') 11 12 for items in soup.select('#cassetteType > li.item'): 13 # タイトル 14 title = items.select_one('p.item-name > a').get_text(strip=True) 15 16 # リンク 17 url = items.select_one('p.item-name > a').get('href') 18 19 # 期間 20 period = items.select_one('dl.item-eventInfo > dd:nth-of-type(1)').get_text(strip=True) 21 22 # 場所 23 place = items.select_one('dl.item-eventInfo > dd:nth-of-type(2)').get_text(strip=True) 24 25 26 # 表示 27 print(title) 28 print(url) 29 print(period) 30 print(place) 31 32 print('-'*20)

結果
第8回大阪マラソン〜OSAKA MARATHON 2018〜
//www.jalan.net/event/evt_224744/
2018年11月25日
大阪市 大阪城公園前(スタート)

ドイツ・クリスマスマーケット大阪
//www.jalan.net/event/evt_227109/
2018年11月16日〜12月25日
大阪市 新梅田シティ ワンダースクエア

大阪・光の饗宴2018 OSAKA光のルネサンス2018
//www.jalan.net/event/evt_228820/
2018年12月14日〜25日
大阪市 大阪市役所周辺〜中之島公園

投稿2018/11/16 04:37

barobaro

総合スコア1286

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

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

kenken0023

2018/11/16 11:56

無事にスクレイピング出来ました。自分の知恵も広がりました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問