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

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

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

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

Q&A

解決済

1回答

2143閲覧

Pythonで機械学習を使って東京23区のお買い得賃貸物件を取得したいですがうまく行かなかった。

lujiaweigood

総合スコア13

Python 3.x

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

1グッド

2クリップ

投稿2018/10/30 16:54

編集2018/10/31 02:23

前提・実現したいこと

https://github.com/ShoKosaka/Suumo/blob/master/Scraping.ipynb
を参照して、summoの家賃情報取得したいですが、生成したCSVファイルでは、賃料、管理費、間取りなどの情報が出てこなかったです。なぜでしょうか。

一応コード全文張り出します。

from bs4 import BeautifulSoup import requests import pandas as pd from pandas import Series, DataFrame import time import urllib import urllib.request from urllib.request import urlopen from bs4 import BeautifulSoup from urllib.request import urlopen headers = {"user-agent":"Mozilla/5.0"} url = 'https://suumo.jp/jj/chintai/ichiran/FR301FC001/?ar=030&bs=040&ta=13&sc=13103&cb=0.0&ct=9999999&et=9999999&cn=9999999&mb=0&mt=9999999&shkr1=03&shkr2=03&shkr3=03&shkr4=03&fw2=&srch_navi=1' result = requests.get(url,headers=headers) #HTMLを元に、オブジェクトを作る soup = BeautifulSoup(result.content,'html.parser') print(soup.title) #物件リストの部分を切り出し summary = soup.find("div",{'id':'js-bukkenList'}) #ページ数を取得 body = soup.find("body") pages = body.find_all("div",{'class':'pagination pagination_set-nav'}) pages_text = str(pages) pages_split = pages_text.split('</a></li>\n</ol>') pages_split0 = pages_split[0] pages_split1 = pages_split0[-3:] pages_split2 = pages_split1.replace('>','') pages_split3 = int(pages_split2) #URLを入れるリスト urls = [] #1ページ目を格納 urls.append(url) #2ページ目から最後のページまでを格納 for i in range(pages_split3-1): pg = str(i+2) url_page = url + '&pn=' + pg urls.append(url_page) name = [] #マンション名 address = [] #住所 locations0 = [] #立地1つ目(最寄駅/徒歩~分) locations1 = [] #立地2つ目(最寄駅/徒歩~分) locations2 = [] #立地3つ目(最寄駅/徒歩~分) age = [] #築年数 height = [] #建物高さ floor = [] #階 rent = [] #賃料 admin = [] #管理費 others = [] #敷/礼/保証/敷引,償却 floor_plan = [] #間取り area = [] #専有面積 #各ページで以下の動作をループ for url in urls: #物件リストを切り出し c = urllib.request.urlopen(url) soup = BeautifulSoup(c,'html.parser') summary = soup.find("div",{'id':'js-bukkenList'}) #マンション名、住所、立地(最寄駅/徒歩~分)、築年数、建物高さが入っているcassetteitemを全て抜き出し cassetteitems = summary.find_all("div",{'class':'cassetteitem'}) #各cassetteitemsに対し、以下の動作をループ for i in range(len(cassetteitems)): #各建物から売りに出ている部屋数を取得 tbodies = cassetteitems[i].find_all('tbody') #マンション名取得 subtitle = cassetteitems[i].find_all("div",{ 'class':'cassetteitem_content-title'}) subtitle = str(subtitle) subtitle_rep = subtitle.replace( '[<div class="cassetteitem_content-title">', '') subtitle_rep2 = subtitle_rep.replace( '</div>]', '') #住所取得 subaddress = cassetteitems[i].find_all("li",{ 'class':'cassetteitem_detail-col1'}) subaddress = str(subaddress) subaddress_rep = subaddress.replace( '[<li class="cassetteitem_detail-col1">', '') subaddress_rep2 = subaddress_rep.replace( '</li>]', '') #部屋数だけ、マンション名と住所を繰り返しリストに格納(部屋情報と数を合致させるため) for y in range(len(tbodies)): name.append(subtitle_rep2) address.append(subaddress_rep2) #立地を取得 sublocations = cassetteitems[i].find_all("li",{ 'class':'cassetteitem_detail-col2'}) #立地は、1つ目から3つ目までを取得(4つ目以降は無視) for x in sublocations: cols = x.find_all('div') for i in range(len(cols)): text = cols[i].find(text=True) for y in range(len(tbodies)): if i == 0: locations0.append(text) elif i == 1: locations1.append(text) elif i == 2: locations2.append(text) #築年数と建物高さを取得 tbodies = cassetteitems[i].find_all('tbody') col3 = cassetteitems[i].find_all("li",{ 'class':'cassetteitem_detail-col3'}) for x in col3: cols = x.find_all('div') for i in range(len(cols)): text = cols[i].find(text=True) for y in range(len(tbodies)): if i == 0: age.append(text) else: height.append(text) #階、賃料、管理費、敷/礼/保証/敷引,償却、間取り、専有面積が入っているtableを全て抜き出し tables = summary.find_all('table') #各建物(table)に対して、売りに出ている部屋(row)を取得 rows = [] for i in range(len(tables)): rows.append(tables[i].find_all('tr')) #各部屋に対して、tableに入っているtext情報を取得し、dataリストに格納 data = [] for row in rows: for tr in row: cols = tr.find_all('td') for td in cols: text = td.find(text=True) data.append(text) #dataリストから、階、賃料、管理費、敷/礼/保証/敷引,償却、間取り、専有面積を順番に取り出す index = 0 for item in data: if '階' in item: floor.append(data[index]) rent.append(data[index+1]) admin.append(data[index+2]) others.append(data[index+3]) floor_plan.append(data[index+4]) area.append(data[index+5]) index +=1 #プログラムを10秒間停止する(スクレイピングマナー) time.sleep(10) #各リストをシリーズ化 name = Series(name) address = Series(address) locations0 = Series(locations0) locations1 = Series(locations1) locations2 = Series(locations2) age = Series(age) height = Series(height) floor = Series(floor) rent = Series(rent) admin = Series(admin) others = Series(others) floor_plan = Series(floor_plan) area = Series(area) #各シリーズをデータフレーム化 suumo_df = pd.concat([name, address, locations0, locations1, locations2, age, height,floor,rent,admin,others,floor_plan,area],axis=1) #カラム名 suumo_df.columns=['マンション名','住所','立地1','立地2','立地3','築年数','建物高さ','階','賃料','管理費', '敷/礼/保証/敷引,償却','間取り','専有面積'] #csvファイルとして保存 suumo_df.to_csv('suumo_minato.csv', sep = '\t',encoding='utf-16')

CSVファイルではこういう風に出てきました。

イメージ説明

python version: 3.7.1

Koopa👍を押しています

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

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

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

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

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

mrkmyki

2018/10/30 17:21

どこまでは上手く行っているとか、どんなエラーが出ているとか、困っている事を具体的に説明しないと回答が付かないと思います。
lujiaweigood

2018/10/30 17:35

申し訳ないです。うまく行かなかったところを追加説明しました。
y_waiwai

2018/10/30 23:57

出てこなかったとは、どういうふうに出たんでしょうか?
lujiaweigood

2018/10/31 02:26

出てこなかった図を追加しました。
tiitoi

2018/10/31 02:37 編集

サイト構成が記事を執筆した時点から変わっているかもしれないので、開発者ツール (Chrome だとF12) で、DOM の選択が正しいのか確認してみてはどうでしょうか。
guest

回答1

0

ベストアンサー

ぱっと見ですが、以下のインデント的にif文の外に出す必要があるのではないでしょうか?
もしくはスクレイピング元サイトの構成が変更になったかですかね。

python

1for item in data: 2 if '階' in item: 3 floor.append(data[index]) 4 rent.append(data[index+1]) 5 admin.append(data[index+2]) 6 others.append(data[index+3]) 7 floor_plan.append(data[index+4]) 8 area.append(data[index+5])

投稿2018/10/31 00:28

tabuu

総合スコア2449

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

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

lujiaweigood

2018/10/31 02:25

ありがとうございます。それ試したですけど、やはり家賃は出てこなかったです。スクレイピング元サイトの構成が変更があったと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問