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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

Q&A

0回答

923閲覧

スクレイピングをしようとしたらAttributeErrorが出てしまいます。

yutoooo

総合スコア13

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python

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

0グッド

0クリップ

投稿2018/11/03 08:13

https://openweathermap.org/city/1850144⇦このサイトの天気情報↓

html

1<div id="weather-widget" class="weather-widget" 2><h2 class="weather-widget__city-name">Weather in Tōkyō-to, JP</h2> 3<h3 class="weather-widget__temperature"><img class="weather-widget__img" src="https://openweathermap.org/img/w/09d.png" alt="Weather Tōkyō-to , JP" width="50" height="50">18 °C</h3> 4 5<p class="weather-widget__main">shower rain</p><!--この部分を取得したい--> 6 7</div>

をスクレイピングしたくて下記のように書いてみたのですが

python

1import requests 2from bs4 import BeautifulSoup 3#目的のURL 4url = "https://openweathermap.org/city/1850144" 5#HTTPリクエスト 6r = requests.get(url) 7# 8bsObj = BeautifulSoup(r.content,"html.parser") 9# 10today = bsObj.find(class_="weather-widget") 11# 12weather = today.p.string 13print("天気:{}".format(weather)) 14

このようなエラーメッセージが出てしまい困っています。
一応調べてみるとインスタンスがp属性を持っていないということらしいんですが。。。

何を改善したらshower rainが取得出来るでしょうか??

AttributeError Traceback (most recent call last) <ipython-input-31-6eec385d0b95> in <module>() 10 today = bsObj.find(class_="weather-widget") 11 # ---> 12 weather = today.p.string 13 print("天気:{}".format(weather)) AttributeError: 'NoneType' object has no attribute 'p' 

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

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

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

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

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

can110

2018/11/03 08:35

そもそも論なのですが、なぜWeather APIを利用されないのでしょうか?
yutoooo

2018/11/03 09:16

APIの知識が全くない為スクレイピングしようかなと思いまして。。APIの方が良いですかね。。
can110

2018/11/03 09:18

はい。また、規約でスクレイピングが禁止されている可能性があります。確認ください。
yutoooo

2018/11/03 09:20

ありがとうございます。確認してみます。
hayataka2049

2018/11/03 12:17

取りたい部分が動的に生成されていて、単純にHTTPリクエストで取ってきただけでは取れないパターンかと。selenium等で処理すればできると思いますが、それならAPIを使ったほうが楽だと思いますよ
yutoooo

2018/11/03 12:36

あーなるほど。。pタグの中が変わってしまって駄目という感じですかね。。ありがとうございます!
hayataka2049

2018/11/03 12:37

そもそもtoday本体が存在しないですね。HTTPリクエストで何が返っているかはr.textで確認できるので、ファイルに吐いて検索すればclass="weather-widget"の要素そのものがないことが納得できるはずです
can110

2018/11/03 12:40

いや、NoneType~なので、class_="weather-widget"な要素todayから獲れてないです。
yutoooo

2018/11/03 13:16

えっと、凄くアホな質問だと思うんですがなぜないんでしょうか?検証したところあったはずなんですが。。。
hayataka2049

2018/11/03 13:43 編集

検証したのは要素が描画されてからですよね。その要素の描画はおそらくJavaScriptが動的にクライアントサイドで行っています。HTTPリクエストで直接落としてきた場合はJavaScriptは実行されないので、「HTMLの中に埋め込まれた描画処理を行うJavaScript」は取れますが、それによって描画されたものは取れないですね
yutoooo

2018/11/03 13:50

あーなるほど。。そういうことだったんですね。。丁寧に教えていただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問