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

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

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

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

1回答

839閲覧

python スクレイピング 関数でリストを表示したい

kei_ino

総合スコア1

スクレイピング

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

1クリップ

投稿2021/01/15 07:27

前提・実現したいこと

Python初学者のため見当違いな記述があるかもしれませんがご了承ください。

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

ある販売サイトから商品名や値段を表示するコードを書いていたのですが、関数にしてみようとすると表示が変わってしまいます。以下のコードでは期待した値が表示されます。

期待した値
Nintendo Switch 2019年バッテリー強化版[ネオンブルー・ネオンレッド] JAN:4902370542912 買取価格: 33500円
Nintendo Switch 2019年バッテリー強化版 [グレー] JAN:4902370542905 買取価格: 32000円
Nintendo Switch (赤) マリオカート ライブ ホームサーキット [マリオセット] JAN:4902370545616 買取価格: 7000円
Nintendo Switch (緑) マリオカート ライブ ホームサーキット [ルイージセット] JAN:4902370545753 買取価格: 7000円
Nintendo Switch Lite コーラル JAN:4902370545302 買取価格: 19000円
Nintendo Switch Lite イエロー JAN:4902370542936 買取価格: 19500円
Nintendo Switch Lite グレー JAN:4902370542929 買取価格: 19500円
Nintendo Switch Lite ターコイズ JAN:4902370542943 買取価格: 19500円
Nintendo Switch Lite ザシアンザマゼンタ JAN:4902370544091 買取価格: 19500円
Nintendo Switch あつまれ どうぶつの森セット JAN:4902370545203 買取価格: 39500円

import requests from bs4 import BeautifulSoup url = 'https://gamekaitori.jp/all-goods' response = requests.get(url) response.encoding = response.apparent_encoding bs = BeautifulSoup(response.text, 'html.parser') mainpage_box_list = bs.select('div.sub-pro-box') for pro_border in mainpage_box_list[0].select('div.pro-border'): item_name_tags = pro_border.select('li.sub-pro-name') item_name_tag = item_name_tags[0] item_name = item_name_tag.text.strip() item_jancode_tag = item_name_tags[-1] item_jancode = item_jancode_tag.text.strip() item_price_tags = pro_border.select('li.sub-pro-jia') item_price_tag = item_price_tags[0] item_price = item_price_tag.text.strip() print(item_name, item_jancode, item_price)

イメージ説明

しかし、以下のように関数にすると上記の値の一番上の値しか表示されません。
('Nintendo Switch 2019年バッテリー強化版[ネオンブルー・ネオンレッド]', 'JAN:4902370542912', '買取価格: 33500円')

関数でも期待したような値が表示されるためにはどのようにすればよろしいでしょうか。
拙い質問内容で申し訳ありませんがご教授お願いします。

該当のソースコード

import requests from bs4 import BeautifulSoup def main(): session = requests.Session() response = requests.get('url #実際にはURLを入力しています') bs = BeautifulSoup(response.text, 'html.parser') item = scrape_detail_page(response) print(item) def scrape_detail_page(response: requests.Response) -> dict: mainpage_box_list = bs.select('div.sub-pro-box') for pro_border in mainpage_box_list[0].select('div.pro-border'): item_name_tags = pro_border.select('li.sub-pro-name') item_name_tag = item_name_tags[0] item_name = item_name_tag.text.strip() item_jancode_tag = item_name_tags[-1] item_jancode = item_jancode_tag.text.strip() item_price_tags = pro_border.select('li.sub-pro-jia') item_price_tag = item_price_tags[0] item_price = item_price_tag.text.strip() return item_name, item_jancode, item_price if __name__ == '__main__': main()

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

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

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

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

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

_whitecat_22

2021/01/15 08:36 編集

そもそも、該当のソースコード(関数化したもの)は、エラーとなって動きません。 関数化して動いていたソースコードをご提示いただければ、回答を得られるかと思います。 ``` Traceback (most recent call last): File "test3.py", line 32, in <module> main() File "test3.py", line 9, in main item = scrape_detail_page(response) File "test3.py", line 15, in scrape_detail_page mainpage_box_list = bs.select('div.sub-pro-box') NameError: name 'bs' is not defined ```
guest

回答1

0

for文の中でprintした場合と、returnした場合ではもちろん動作が異なります。
for文を全て回し、結果をリストに入れてからreturnするとかすべきかと。

投稿2021/01/15 08:41

t_obara

総合スコア5488

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

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

kei_ino

2021/01/15 17:45 編集

ご回答いただきありがとうございます。 def scrape_detail_page(response: requests.Response) -> dict: mainpage_box_list = bs.select('div.sub-pro-box') for pro_border in mainpage_box_list[0].select('div.pro-border'): item_name_tags = pro_border.select('li.sub-pro-name') item_name_tag = item_name_tags[0] item_name = item_name_tag.text.strip() item_jancode_tag = item_name_tags[-1] item_jancode = item_jancode_tag.text.strip() item_price_tags = pro_border.select('li.sub-pro-jia') item_price_tag = item_price_tags[0] item_price = item_price_tag.text.strip() item = { '商品名': item_name, 'JANCODE': item_jancode, '値段': item_price } return item 関数の中をこのように変更したのですが、こうすると逆に {'商品名': 'Nintendo Switch あつまれ どうぶつの森セット', 'JANCODE': 'JAN:4902370545203', '値段': '買取価格: 39500円'} のように期待したようなリストの最後の値だけが表示されてしまいます。 重ね重ね申し訳ございませんが解決策をご教授いただければ幸いです。
t_obara

2021/01/16 08:34

最後だけ格納するようにしているからです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問