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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5227閲覧

object of type 'Response' has no len()というエラーを解決したい

Saru024

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/03/03 11:20

前提・実現したいこと

プログラミング・Python初級者です。
https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406のサイトを参考に、スクレイピングの練習をしていました。
「1時間ごとに日本経済新聞にアクセスを行いその時の日経平均株価をcsvに記録する」プログラムです。
このサイトのコードはPython2で書かれているので、Python3との違いに気を付けていますが、なかなかうまくいきません。

発生している問題・エラーメッセージ

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-6-94a6354274e0> in <module>() 33 34 # htmlをBeautifulSoupで扱う ---> 35 soup = BeautifulSoup(html, "html.parser") 36 37 # span要素全てを摘出→全てのspan要素が配列に入ってかえされる→[<span class="m-wficon triDown"></span>, <span class="l-h... ~\Anaconda3\lib\site-packages\bs4\__init__.py in __init__(self, markup, features, builder, parse_only, from_encoding, exclude_encodings, **kwargs) 244 if hasattr(markup, 'read'): # It's a file-type object. 245 markup = markup.read() --> 246 elif len(markup) <= 256 and ( 247 (isinstance(markup, bytes) and not b'<' in markup) 248 or (isinstance(markup, str) and not '<' in markup) TypeError: object of type 'Response' has no len()

###該当のソースコード

import requests from bs4 import BeautifulSoup from datetime import datetime import csv import time time_flag = True # ①永久に実行させる while True: # 時間が59分以外の場合は58秒間時間を待機する if datetime.now().minute != 59: # 59分ではないので1分(58秒)間待機します(誤差がないとは言い切れないので58秒) time.sleep(58) continue # csvを追記モードで開く→ここでcsvを開くのはファイルが大きくなった時にcsvを開くのに時間がかかるため f = open('nikkei_heikin.csv', 'a') writer = csv.writer(f, lineterminator='\n') # 59分になったが、正確な時間に測定をするために秒間隔で59秒になるまで抜け出せない while datetime.now().second != 59: # 00秒ではないので1秒待機 time.sleep(1) # 処理が早く終わり二回繰り返してしまうため、ここで一秒間待機 time.sleep(1) # csvに記述するレコードを作成 csv_list = [] # 現在の時刻を年、月、日、時、分、秒で取得 time_ = datetime.now().strftime("%Y/%m/%d %H:%M:%S") # 1カラム目に時間を挿入 csv_list.append(time_) # アクセスするURL url = "http://www.nikkei.com/markets/kabu/" # URLにアクセスする htmlが帰ってくる → <html><head><title>経済、株価、ビジネス、政治のニュース:日経電子版</title></head><body.... html = requests.get(url) # htmlをBeautifulSoupで扱う soup = BeautifulSoup(html, "html.parser") # span要素全てを摘出→全てのspan要素が配列に入ってかえされる→[<span class="m-wficon triDown"></span>, <span class="l-h... span = soup.find_all("span") # print時のエラーとならないように最初に宣言しておく。 nikkei_heikin = "" # for分で全てのspan要素の中からClass="mkc-stock_prices"となっている物を探す for tag in span: # classの設定がされていない要素は、tag.get("class").pop(0)を行うことのできないでエラーとなるため、tryでエラーを回避する try: # tagの中からclass="n"のnの文字列を摘出します。複数classが設定されている場合があるので # get関数では配列で帰ってくる。そのため配列の関数pop(0)により、配列の一番最初を摘出する # <span class="hoge" class="foo"> → ["hoge","foo"] → hoge string_ = tag.get("class").pop(0) # 摘出したclassの文字列にmkc-stock_pricesと設定されているかを調べる if string_ in "mkc-stock_prices": # mkc-stock_pricesが設定されているのでtagで囲まれた文字列を.stringであぶり出します nikkei_heikin = tag.string # 摘出が完了したのでfor分を終了 break except: # パス→何も処理を行わない pass # 摘出した日経平均株価を時間とともに出力。 print(time_, nikkei_heikin) # 2カラム目に日経平均を記録 csv_list.append(nikkei_heikin) # csvに追記敷く writer.writerow(csv_list) # ファイル破損防止のために閉じる f.close()

なかなか上手くいかず、歯がゆいです。
ご助言いただければ嬉しいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

diff

1- soup = BeautifulSoup(html, "html.parser") 2+ soup = BeautifulSoup(html.content, "html.parser")

Response オブジェクトではなく、応答内容を持つバイト列 Response.content を BeautifulSoup のコンストラクタにわたす。

投稿2019/03/03 11:24

tiitoi

総合スコア21954

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問