teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

Python

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

Q&A

解決済

1回答

607閲覧

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

tyonmage12

総合スコア5

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2023/07/04 04:32

0

0

実現したいこと

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/ツールのバージョンなど)

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

image[0]['rel'] で取得できると思います。

HTMLやXMLでは、alt=...rel=.. のことを「属性」と呼びます。開始タグと終了タグの組で表現されたものを「要素」と呼びます。

投稿2023/07/04 04:44

編集2023/07/04 14:01
int32_t

総合スコア21929

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

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

tyonmage12

2023/07/04 13:30

ご回答ありがとうございます! どの部分で、image["rel"]を記載するのでしょうか、、? TypeError: list indices must be integers or slices, not str となり、エラー解消出来ません、、
int32_t

2023/07/04 14:00

おっとすみません、image[0]['rel'] でした。
tyonmage12

2023/07/04 14:27

ありがとうございます! image = detail.select("img") images = image[0]["rel"] で取得することが出来ました! ちなみに、先ほど試行錯誤した結果、 image = detail.img["rel"] でも取得できたのですが、正しい取得方法でしょうか? もし、今後色々とスクレイピングしていく上で非推奨なやり方であれば、避けたいと思うのですが、、 何度も申し訳ございませんが、ご教示頂けますと幸いです。
tyonmage12

2023/07/05 13:47

ありがとうございます! また1段ステップアップ出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問