BeautifulSoupを用いた、スクレイピング方法について

実現したいこと

HTMLデータから、特定のタグの特定の要素のみを抽出し、CSVファイルに落とし込みたい

前提

webスクレイピング初心者なのですが、SUUMOの物件情報をまとめてCSVファイルに落とし込むという練習をしております。

その中で、テキストデータのみを抜き出してファイルに落とし込むことは出来たのですが、画像のURLも同時にスクレイピングしようと思い、コードを書いたところURLの抽出が出来ず困っております。

URLは、タグの中で要素が複数存在し、その中の一つの要素に格納されています。
しかし、タグを丸々抽出できても特定の要素のみの抽出が出来ません。

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

テキストデータと同時にタグの中から、特定の要素(URL)の抽出が出来ない。

[<img alt="" class="js-noContextMenu js-linkImage js-scrollLazy js-adjustImg" height="0" rel="https://img01.suumo.com/front/gazo/fr/bukken/867/100335445867/100335445867_gw.jpg" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw%3D%3D" width="0">
</img>]

コードを実行した結果が上記になりますが、その中から"rel"内にあるURLのみを辞書に格納し、CSVファイルに落とし込みたいです。

該当のソースコード

Python

1import requests 2from bs4 import BeautifulSoup 3from pprint import pprint 4from time import sleep 5import pandas as pd 6import re 7 8url = "https://suumo.jp/jj/chintai/ichiran/FR301FC001/?ar=010&bs=040&ra=001&cb=0.0&ct=9999999&et=9999999&cn=9999999&mb=0&mt=9999999&shkr1=03&shkr2=03&shkr3=03&shkr4=03&fw2=&rn=4050&rn=4055&rn=4060&page={}"9 10d_list = []11 12for i in range(1,4):13 #print("d_listの大きさ:",len(d_list))14 target_url = url.format(i)15 #print(target_url)16 17 r = requests.get(target_url)18 19 sleep(1)20 21 soup = BeautifulSoup(r.text,"html.parser")22 23 24 25 contents = soup.find_all("div",class_="cassetteitem")26 for content in contents:27 28 #物件情報を取得29 detail = content.find("div",class_="cassetteitem-detail")30 31 #部屋情報を取得32 table = content.find("table",class_="cassetteitem_other")33 34 #物件情報からそれぞれの要素を取得35 image = detail.select("img")#分からない今回のコード36 title = detail.find("div",class_="cassetteitem_content-title").text 37 address =detail.find("li",class_="cassetteitem_detail-col1").text 38 acsess = detail.find("li",class_="cassetteitem_detail-col2").text 39 age = detail.find("li",class_="cassetteitem_detail-col3").text 40 41 42 #部屋情報からそれぞれの要素を取得43 tr_tags = table.find_all("tr",class_="js-cassette_link")44 45 for tr_tag in tr_tags:46 47 floor,rent,first_fee,capacity = tr_tag.find_all("td")[2:6]48 49 price,administration = rent.find_all("li")50 deposit,gratuity = first_fee.find_all("li")51 madori,menseki = capacity.find_all("li")52 53 #辞書に格納54 d = {"image":image,"title":title,"address":address,"acsess":acsess,"age":age,55 "floor":floor.text,"price":price.text,"administration":administration.text,56 "deposit":deposit.text,"gratuity":gratuity.text,"madori":madori.text,"menseki":menseki.text}57 58 d_list.append(d)59 60print(image)61 62""" 63df = pd.DataFrame(d_list) 64 65 66df2 = df.applymap(lambda x: re.sub('\n', ' ', x)) 67df3 = df2.applymap(lambda x: re.sub('\r', ' ', x)) 68df4 = df3.applymap(lambda x: re.sub('\t', ' ', x)) 69 70df4.to_csv("bukken.csv",index=None,encoding="utf-8-sig") 71 72 73 74"""

試したこと

上記のように、find()ではなく、select()も使用してみましたが、imgタグの抽出までしかできませんでした、、

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

ここにより詳細な情報を記載してください。

コメントを投稿

0 コメント