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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python

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

Q&A

解決済

2回答

1949閲覧

ショッピングサイトの特売情報をスクレイピングしてSlackに通知したい

asui9625

総合スコア11

Python

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

0グッド

0クリップ

投稿2018/09/03 16:36

編集2018/09/03 16:39

Pythonで楽天ブックスの特売情報をスクレイピングしようとしています。
その情報はSlackに通知して、特定のメンバーと共有したいです。

エラーが発生しており、原因がわかりません。

※この特売情報は表示されている時間が限定されており、通常時は表示されていません。
最終的な動作テストはその限定された時間で確認する必要がありそうです。

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

Traceback (most recent call last):
File "test.py", line 27, in <module>
scraping()
File "test.py", line 22, in scraping
headlines = mainNewsIndex.find_all("span", attrs={"style", "color: #ffffff;"})
AttributeError: 'NoneType' object has no attribute 'find_all'

該当のソースコード

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

import slackweb
from urllib import request
from bs4 import BeautifulSoup

def scraping():

url = "https://books.rakuten.co.jp/" html = request.urlopen(url) soup = BeautifulSoup(html, "html.parser") mainNewsIndex = soup.find("div", attrs={"style", "margin: 10px 0;padding: 8px; background: #ff9900;font-size: 15px; font-weight: bold; text-align: center; z-index: 0;color: #330000;" }) headlines = mainNewsIndex.find_all("span", attrs={"style", "color: #ffffff;"}) print(headlines)

scraping()

slack = slackweb.Slack(url="https://hooks.slack.com/services/XXXXXX")
slack.notify(text=headlines)

試したこと

Slackへテスト通知はできました。
SSLの部分は通知のために必要でした。(エラー回避)

実際に楽天ブックスからスクレイピングする部分で失敗しているように見受けられます。

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

beautifulsoup4 4.6.3
slackweb 1.0.5
urllib3 1.23

まだその特売時間が来ていないため、完全なテストはできていません。
プログラムは学生時代に授業で触った程度の初心者です。申し訳ありません。

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

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

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

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

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

guest

回答2

0

divのstyle いません
だから発生している問題
あと ","変更":"
イメージ説明
このウェブサイトは大量にjsを使っています,ajaxから入手できます
イメージ説明
こちらですか?
イメージ説明

投稿2018/09/23 11:08

編集2018/09/27 08:04
fcitx

総合スコア134

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

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

asui9625

2018/09/26 13:08

ありがとうございます。 見る時間によっては、抽出したいタグが存在していない状態です。 私が今回抽出したい情報は、特定の時間だけ、サイトの上部に発生します。 (以下のソースを見ていただけると助かります。) 表示時は抽出できる時は抽出して、最終的にスラックに書き込み 表示されていない時は、無しorエラーで何もしない というのが最終目標です。 ーーー以下、楽天ブックス、375行目付近、抽出対象表示時ソースーーー <!-- パケメ共通 帯バナー枠 --> <!-- all-notice-pc.html --> <div style="margin: 10px 0;padding: 8px; background: #ff9900;font-size: 15px; font-weight: bold; text-align: center; z-index: 0;color: #330000;" > <span style="color: #ffffff;">【8月30日19時00分&#65374;19時59分まで】</span> &nbsp;<span style="color:#ffffff;">ポイント3倍以上!</span>&nbsp; </div> <!-- お知らせ --> <!-- /パケメ共通 帯バナー枠 -->
guest

0

ベストアンサー

要素が見つからなかった時のif文分岐に考慮漏れがあります。
適切に例外処理をしてください。

見つけるポイントは、Noneがfind_allのメソッドを持っていません、ということなので、本来要素であるべきものが見つからず、Noneになってしまったと推測できます。

mainNewsIndexが不測の形か、存在していないはずです。

投稿2018/09/03 22:37

mkgrei

総合スコア8560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問