souwasora
@souwasora (takei souwa)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

python BeautifulSoup if分

解決したいこと

自己学習でPythonを学び始めました
Steamのゲームの抽出をしたく、BeautifulSoupを使用しております
Steamでは、セールしてる商品があり、class名が違く
for文で回す際エラーが起きてしまいます
if文など使って回避できるのか
解決を教えて頂きたいです

#セール商品
game_price = game.find('div', attrs={'class': 'col search_price discounted responsive_secondrow'}).text
#セールしてない(通常)
game_price = game.find('div', attrs={'class': 'col search_price  responsive_secondrow'}).text

発生している問題・エラー

3 game_price = game.find('div', attrs={'class': 'col search_price  responsive_secondrow'}).text
      4 game_price = game_price.replace('\n', '')
      5 game_price

AttributeError: 'NoneType' object has no attribute 'text'

該当するソースコード

import requests
from bs4 import BeautifulSoup
import csv
import pandas as pd
#キーワード入力
search_word = input("検索キーワード=")
url =  'https://store.steampowered.com/search/?term=' + search_word
res = requests.get(url)
#parser = 分割的な意味
soup = BeautifulSoup(res.text, 'html.parser')
#全体
games = soup.find_all('div', attrs={'class': 'responsive_search_name_combined'})
#for文ではなく今は1個持ってきている
game = games[0]
#ゲームのタイトル
game_title = game.find('span', attrs={'class': 'title'})
#セールしてる商品の金額
game_price = game.find('div', attrs={'class': 'col search_price discounted responsive_secondrow'}).text
#通常商品
game_price = game.find('div', attrs={'class': 'col search_price  responsive_secondrow'}).text

game_price = game_price.replace('\n', '')
game_price

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。
for文で実施した際
セールしてる商品なら

game_price = game.find('div', attrs={'class': 'col search_price discounted responsive_secondrow'}).text

してないなら

game_price = game.find('div', attrs={'class': 'col search_price  responsive_secondrow'}).text

と分岐と言いますか条件にする方法が分かりません。。。

0

2Answer

find() ではなく select() を使うとよさそうです。 find() で要素を探すには class 属性の値が完全に一致している必要がありますが、 select() なら一部のクラスだけを指定して探すことができます。以下のように書いてください。

game_price = game.search('div.col.search_price').text

'div.col.search_price' は div 要素かつ class 属性に col と search_price を含むものに一致するという意味です。ここの指定はセールの有無にかかわらずついているクラスに合わせて調整してください。

記法について詳しくはこのページが参考になります https://www.tohoho-web.com/css/selector.htm#ClassSelector

2Like

Comments

  1. @souwasora

    Questioner

    @uasi様
    selectで持ってくることができました。
    ありがとうございます。

if 文でやるなら以下のように、まず要素が取得できたかチェックしてから .text を参照するといいです。

game_price_elem = game.find('div', セール時)

if game_price_elem:
    game_price = game_price_elem.text
else:
    game_price = game.find('div', 非セール時).text
0Like

Your answer might help someone💌