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

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

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

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

1437閲覧

Pythonスクレイピング:'NoneType' object is not subscriptableのエラーについて

gomasan

総合スコア96

スクレイピング

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

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Python

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

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2020/09/08 06:12

編集2020/09/08 07:59

前提

Pythonでスクレイピングを行っています。
(社内用のためurlは一部変更しています。)

ライブラリ:selenium

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

昨日の日付のみそれ以降の処理に進むということをしたいのですが、正規表現のところで引っかかっています。。

エラー文

File "/Users/myname/Desktop/file/vscode/f_rescue.py", line 46, in <module> cfm_date = str2date(cfm_date_str) File "/Users/myname/Desktop/file/vscode/f_rescue.py", line 12, in str2date tar_date = datetime(int(result[1]), int(result[2]), int(result[3])) TypeError: 'NoneType' object is not subscriptable

エラー箇所

<line 46> cfm_date = str2date(cfm_date_str) <line 12> tar_date = datetime(int(result[1]), int(result[2]), int(result[3]))

一応ブラウザの動きを見ると、

# 遷移したページ内の投稿日を確認 table_striped_box = driver.find_elements_by_css_selector(".table > tbody > tr")

このページまでは遷移します。

該当のソースコード

python

1from selenium import webdriver 2import time 3import csv 4import re 5from datetime import datetime, date, timedelta 6from selenium.webdriver.common.keys import Keys 7from selenium.webdriver.chrome.options import Options 8 9 10def str2date(date_str): 11 result = re.search(r'(\d{4}).(\d{2}).(\d{2}).', date_str) 12 tar_date = datetime(int(result[1]), int(result[2]), int(result[3])) 13 return tar_date 14 15def is_yesterday(tar_date): 16 now = datetime.now() 17 yesterday = now - timedelta(days=1) 18 yesterday_str = datetime.strftime(yesterday, '%Y-%m-%d') 19 tar_date_str = datetime.strftime(tar_date, '%Y-%m-%d') 20 21 return tar_date_str == yesterday_str 22 23 24# driver = webdriver.Chrome('/usr/local/bin/chromedriver',chrome_options=options) 25driver = webdriver.Chrome('/usr/local/bin/chromedriver') 26driver.get('https://xxx.com/admin/admin/user/login') 27 28# ID/PASSを入力 29id = driver.find_element_by_id("xxx") 30id.send_keys("xxx") 31password = driver.find_element_by_id("xxx") 32password.send_keys("xxx") 33 34time.sleep(1) 35 36# ログインボタンをクリック 37login_button = driver.find_element_by_css_selector("button.btn") 38login_button.click() 39 40# サイト内で特定のページに遷移 41driver.get('https://xxx.com/admin/order') 42# 遷移したページ内の投稿日を確認 43table_striped_box = driver.find_elements_by_css_selector(".table > tbody > tr") 44 45for table_striped in table_striped_box: 46 cfm_date_str = table_striped.find_elements_by_css_selector("td")[2].text 47 cfm_date = str2date(cfm_date_str) 48 print(cfm_date) 49# if is_yesterday(cfm_date): 50# print('cfm_date_str')

試したこと

#プリントで確認 print(cfm_date_str) 2020.09.08 2020.09.08 2020.09.08 2020.09.07 2020.09.07 2020.09.06

実現したいこと

コードの一番下にコメントアウトで記載している

if is_yesterday(cfm_date): print('cfm_date_str')

でprint('cfm_date_str')部分を実際の処理に変更し、昨日の日付のもののみこの処理を行うようにしたいです。

アドバイスいただけますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

nto

2020/09/08 07:48

どこでエラーが生じたという事なのでしょうか?
gomasan

2020/09/08 07:59

大変失礼いたしました。エラー箇所の記載が抜けておりました。追記いたしました。
guest

回答1

0

ベストアンサー

正規表現の最後のdotが1個余計でした。

python3

1import re 2from datetime import datetime 3 4def str2date(date_str): 5 result = re.search(r'(\d{4}).(\d{2}).(\d{2})', date_str) 6 tar_date = datetime(int(result[1]), int(result[2]), int(result[3])) 7 return tar_date 8cfm_date_str = "2020.09.08" 9print(str2date(cfm_date_str)) # -> 2020-09-08 00:00:00

投稿2020/09/08 08:42

編集2020/09/08 08:43
jeanbiego

総合スコア3966

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

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

gomasan

2020/09/08 10:32

ありがとうございます!!無事昨日の日付だけ抽出できました、、気がついてくださりありがとうございます。とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問