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

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

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

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

Python 3.x

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

Python

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

Q&A

解決済

2回答

4793閲覧

Python 多次元辞書について

RWW

総合スコア13

スクレイピング

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

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2018/04/15 05:16

編集2018/04/15 05:40

Pythonを使いスクレイピングのコードを書いております。
アパレルブランドのサイトから、商品カテゴリー名、商品名、商品画像を取得し
カテゴリー名 > 商品名 > 商品画像 という風にフォルダを作成し保存をしたいです。
下記画像のようなイメージで辞書の中にリストを作成したいです。
(カテゴリー名、商品名はスクレイピングした際に取得された数だけ作成したいので、この図のように数が固定されている訳ではありません。)
イメージ説明

私自身プログラミング初心者で、これをどのようにプログラミングすれば効率よく作成できるのかがわかりません。

今途中まで書いているコードがこちらになります

Python

1import requests 2from bs4 import BeautifulSoup 3import pprint 4import os 5from urllib.parse import urljoin 6import itertools 7 8sex_URL = "https://www.gucci.com/jp/ja/ca/men-c-men" 9soup = BeautifulSoup(requests.get(sex_URL).content,'lxml') 10 11def make_folder(category_folder_name): 12 os.makedirs("/Users/AA/Desktop/GUCCI/メンズ/" +category_folder_name,exist_ok=True) 13 14#カテゴリ毎のURLを取得し、相対パスを絶対パスに変換 15#item_category_listにURLを格納 16base = "https://www.gucci.com/jp/ja/" 17item_category_link = soup.find_all("a",class_="category-product") 18item_category_list = [] 19for item_category_link in item_category_link: 20 item_category_list.append(urljoin(base,item_category_link.get("href"))) 21print(item_category_list) 22 23item_category_name = soup.select("header > h2") 24item_category_name_list = [] 25for item_category_name in item_category_name: 26 item_category_name_list.append((item_category_name).getText()) 27 make_folder((item_category_name).getText()) 28print(item_category_name_list) 29 30#item_category_listとitem_category_name_listのリストを1つのディクショナリに変換 31keys = item_category_name_list 32values = item_category_list 33category = dict(zip(keys,values)) 34print(category) 35 36#カテゴリ毎にURLを解析する 37base = "https://www.gucci.com/jp/ja/" 38item_list = [] 39for category_name in category: 40 soup= BeautifulSoup(requests.get(category[category_name]).content,'lxml') 41 item_link = soup.find_all("a",class_="product-tiles-grid-item-link") 42 for item_link in item_link: 43 item_list.append(urljoin(base,item_link.get("href")) 44 print(item_list)

このコードを書いていて、最初に多次元の辞書を宣言してその中に取得した値を追加していく方法はないのかなと思いました。

自分で色々調べたのですが、そもそも多次元の辞書を空の状態で宣言できるのかと、宣言できたとしても
そこにどのようにリストや辞書を追加すればいいのかがわかりません。

ご教授いただけたらと思います。

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

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

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

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

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

guest

回答2

0

ベストアンサー

defaultdictを利用すれば可能ではあります。辞書の2段ネスト+リストの例を以下に示します。

python

1>>> from collections import defaultdict 2>>> d = defaultdict(lambda :defaultdict(list)) 3>>> d["hoge"]["fuga"].append(1) 4>>> d["hoge"]["piyo"].append(2) 5>>> d 6defaultdict(<function <lambda> at 0x7f1220f41840>, {'hoge': defaultdict(<class 'list'>, {'fuga': [1], 'piyo': [2]})})

defaultdictはcallableを引数に渡してインスタンス化することで、それがデフォルト値としてセットされた辞書を作ります。
ただ、このようなデータ構造を使うより、pandasデータフレームを使う、XMLとして記録する、DBに入れる、などの方針を取った方が後のことを考えると良いかもしれません。

投稿2018/04/15 05:33

hayataka2049

総合スコア30933

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

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

RWW

2018/04/15 06:05

ありがとうございます。pandasを検討してみます!
guest

0

質問を読んで感じたことを書きます。
コードの構成を考えるヒントにしてください。

1)
辞書(Dictionary)は、キーと値のペアの集まりです。
1つのキーに対して、1つの値が対応づけられます。

多次元の辞書というのは、辞書の値が、辞書であるようなものを指しているのだと思います。
2次元の辞書は、キーと辞書(値)のペアの集まり。
3次元の辞書は、キーと2次元の辞書(値)のペアの集まり。
というように、構成してゆくものです。
最初から、多次元の辞書を宣言するものではありません。

普通はスクレイピングを始める前に、対象のWebサイトの構成は判っていません。そのため、スクレイピングした結果を入れる多次元の辞書を事前に用意しておくことは不可能です。

2)
質問に「フォルダを作成し保存をしたいです」という文と「辞書の中にリストを作成したいです」という文がありますが、これらは以下のような意味ではないかと推測します。
「フォルダを作成し保存をしたいです」というのは、「1つ下の階層の辞書に保存したい」(例えば、"カテゴリー名をキーとする辞書が有る時に、その値として'カテゴリーURLをキーとする辞書'を入れたい")
「辞書の中にリストを作成したいです」は、キーのリストと値のリスト(例えば、商品名のリストと、商品URLのリスト)から、辞書を作成したい。

 コードのコメントには「#item_category_listとitem_category_name_listのリストを1つのディクショナリに変換」と書かれています。」
"ディクショナリ"と"Dictionary"と"辞書"は同じものを指していますよね? プログラムを作成する際、仕様、コード等で使う用語は統一しておかないと混乱します。そして、しばしばバグの原因になりますから、この質問も含めて関係するデータや文書での用語統一を図ってください。
用語の統一をしていくと、自分がやろうとしてる事への理解が高まります。そして、正しいコードにするのが早くなります。

投稿2018/04/15 06:08

coco_bauer

総合スコア6915

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

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

RWW

2018/04/16 05:19

ご丁寧にありがとうございます。 参考にさせていただき、上手くコードを書くことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問