yuhtaryouko
@yuhtaryouko (Yuta Kato)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

if関数がうまく機能していない?

解決したいこと

pythonにてwebページの在庫復活を監視するプログラム作成に挑戦しています。
販売ページのカートボタンのidを取得して文字列を解析、それが特定の文字とイコールになった場合にLINEに通知するという形式を目指しています。

idを取得して、文字列を解析→OK
特定の文字列とイコールになったか判定→?
LINEに通知→×

image.png

該当するソースコード

url = 'https://store.shopping~'
STOCK_WORD = '商品をカートに入れる'

# LINE通知設定
TOKEN = 'QBMbucXXXXXXXXXXXXX'
# APIのURL
api_url = ' https://notify-api.line.me/api/notify'
send_contents = {'在庫復活' + url }

# LINE NOTIFY 辞書型の設定
TOKEN_dic = {'Authorization': 'Bearer' + ' ' + TOKEN}send_dic = {'Message': send_contents}


def find_detail():
    
    res = requests.get(url)
    soup = BeautifulSoup(res.text,'html.parser')

 #idの文字列を取得 add_cartは「商品をカートに入れる」ボタンのid
    try:
        active = soup.find(id='add_cart').get_text()
    except:
        active = ''
    return(active)

def new_stock ():
    
    active = find_detail()
    if active==STOCK_WORD:
        print('入荷')
        requests.post(api_url, headers = TOKEN_dic, data = send_dic)
    else:
        print('在庫なし')

if __name__ == "__main__":
    while True:
        new_stock ()
        time.sleep(60)    

自分で試したこと

コードの順番を入れ替えたりしたのですが、ダメでした。
def find_detailの部分のtry・exeptのあとにprint(active)をすると【商品をカートに入れる】という結果が返ってくるので
そこまでは間違っていないのかなとは思うのですが…

0

2Answer

active に入っている文字列の前後に余計な空白文字などが含まれていませんか? print(f'x{active}x') などとして x商品をカートに入れるx と空白を挟まずに出力されるかどうか確認してください。

もしそうなら、 find_detail の最後を return active.strip() と変えてください。前後の空白を取り除いた文字列を返せます。

0Like

Comments

  1. @yuhtaryouko

    Questioner

    質問返しで申し訳ないのですが、print(f'x{active}x)としたときに

    x商品をカートに入れるx

    ではなく

    x
    商品をカートに入れる
    x

    というように、改行?が入った状態で返ってきました。これは余分なものが入っているのでしょうか?
  2. active には「(改行文字)商品をカートに入れる(改行文字)」が入っているということです。
  3. @yuhtaryouko

    Questioner

    ありがとうございます。今後のためにもう少し'active'の周辺を確認しなおしてみます。

もしくはファジーにこうですかね。(activeという変数名が分かりやすいかは置いておいて)

スクレイピングは相手のマークアップやテキストが変わりうるので、敢えてファジーに検索するようにすると壊れにくくなります。

# または"商品をカートに入れる"
if "カートに入れる" in active:
0Like

Comments

  1. @yuhtaryouko

    Questioner

    ありがとうございます。こちらに変えたらうまくいきました!!!
    (何がいけなかったのかはあまり分かっていませんがw)

    すごい!
  2. 良かったです。ちなみに上のコメントを読みましたが、改行が入るということは`\n商品をカートに入れる\n`という改行コードが行頭、行末に含まれています。

Your answer might help someone💌