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

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

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

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

Beautiful Soup

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

Python 3.x

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

Q&A

解決済

1回答

1033閲覧

ウェブスクレイピング 「href属性」と「alt属性」の取得について

nasu0922

総合スコア17

スクレイピング

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

Beautiful Soup

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

Python 3.x

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

0グッド

1クリップ

投稿2019/05/14 08:28

前提・実現したいこと

特定のサイトから「href属性」と「alt属性」含めた情報ををウェブスクレイピングで取得したい。
具体的には、下記の情報を取得します。
「パチンコORスロット,機種ID(href属性の一部),NEW!(alt属性),機種名、台数」
このうち、「機種ID(href属性の一部)」と「NEW!(alt属性)」以外は取得できていますが、
下記問題が発生しており、正確な情報を取得できておりません。
ご教授の程よろしくお願いいたします。

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

①href属性の取得
→href属性を取得後、一番後ろの数字を任意で取得しましたが、結果を見ると同じ数字になっている。
②alt属性の取得
→NEWの情報のある機種は情報を取得し、そうでない場合は「N」としていますが、結果を見ると全てNEWになっている。

該当コード

Python3

1import requests 2from bs4 import BeautifulSoup 3from pprint import pprint 4url = 'https://p-town.dmm.com/shops/tokyo/12670' 5r = requests.get(url) 6soup = BeautifulSoup(r.text, 'lxml') 7 8data = {} 9for ul in soup.select('ul[class="list-machinesettings"]'): 10 machine_type = 'パチ' 11 if 'パチ' in ul.h4.text: 12 machine_type = 'パチンコ' 13 elif 'スロ' in ul.h4.text: 14 machine_type = 'スロット' 15 16 machines = [] 17 for img in soup.select('i img'): 18 new_machine = img.attrs.get('alt', 'N') 19 for a in ul.select('a[class="link"]'): 20 if 'href' in a.attrs: 21 machine_url = a.attrs['href'] 22 machine_id = machine_url.rsplit('/', 1)[1] 23 else: 24 machine_url = '機種ID無' 25 for li in ul.select('li[class="item"]'): 26 name = li.select_one('div[class="text"]').get_text(strip=True) 27 num = li.select_one('div[class="number"]').get_text(strip=True) 28 machines.append([machine_type,machine_id,new_machine,name, num]) 29 data[machine_type] = machines 30 31pprint(data)

試したこと

過去の履歴やQiitaを検索しましたが、どうしても上記2点の問題の解決には至りませんでした。

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

おもな原因は、HTML階層の走査順に誤りがある(NEWや機種IDを全て取得後に機種名などを取りにいっている)からです。
修正するとしたら以下のような感じになるかと思います。

Python

1 # 略 2 machine_type = 'パチンコ' 3 elif 'スロ' in ul.h4.text: 4 machine_type = 'スロット' 5 6 machines = [] 7 for li in ul.select('li[class="item"]'): 8 9 new_machine = 'N' # 初期化する! 10 for img in li.select('i img'): 11 new_machine = img.attrs.get('alt', 'N') 12 13 for a in li.select('a[class="link"]'): 14 if 'href' in a.attrs: 15 machine_url = a.attrs['href'] 16 machine_id = machine_url.rsplit('/', 1)[1] 17 else: 18 machine_url = '機種ID無' 19 20 name = li.select_one('div[class="text"]').get_text(strip=True) 21 # 略

投稿2019/05/14 09:17

can110

総合スコア38262

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

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

nasu0922

2019/05/14 23:35

'li[class="item"]'を先頭にコードを書き直すのですね。大変参考になりました。 アドバイス通り修正し問題なく動作いたしました。 ご教授いただき誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問