前提・実現したいこと
Pythonでサイトの口コミをスクレイピングしています。
また、結果をcsvに抽出しています。
ライブラリ:selenium
発生している問題
正規表現を使って、昨日の日付のみ抽出したいのですが、
2019年の口コミになると以下の通りエラーとなります。
Traceback (most recent call last): File "/Users/xxx/Desktop/ファイル/choice/xxx.py", line 66, in <module> review_date = str2date(review_date_str) File "/Users/xxx/Desktop/ファイル/choice/xxx.py", line 9, in str2date tar_date = datetime(int(result[1]), int(result[2]), int(result[3])) TypeError: 'NoneType' object is not subscriptable
該当のソースコード
コード全体
python
1from selenium import webdriver 2import time 3import csv 4import re 5from datetime import datetime, date, timedelta 6 7def str2date(date_str): 8 result = re.search(r'(\d{4})年(\d{1,2})月(\d{1,2})日', date_str) 9 tar_date = datetime(int(result[1]), int(result[2]), int(result[3])) 10 print(result[1]) 11 return tar_date 12 13def is_yesterday(tar_date): 14 now = datetime.now() 15 yesterday = now - timedelta(days=1) 16 yesterday_str = datetime.strftime(yesterday, '%Y-%m-%d') 17 tar_date_str = datetime.strftime(tar_date, '%Y-%m-%d') 18 19 return tar_date_str == yesterday_str 20 21# 現在の時刻を年、月、日、時、分、秒で取得 22time_ = datetime.today().strftime("%Y%m%d") 23 24csv_file_name = "choice" + time_ + ".csv" 25f = open(csv_file_name, 'w',encoding='cp932', errors='ignore') 26 27#ファイルへの書き込み 28writer = csv.writer(f, lineterminator='\n') 29 30#headerの指定 31csv_header = ["商品名", "投稿日","レビュー"] 32writer.writerow(csv_header) 33 34# ブラウザを開く 35browser = webdriver.Chrome() 36# URLを開く 37url = "https://www.furusato-tax.jp/city/product/01219?incsoldout=1&sort=11&page=1" 38browser.get(url) 39time.sleep(1.0) 40elems_box = browser.find_element_by_css_selector('.result-search') 41elems = elems_box.find_elements_by_css_selector('.card-product') 42review_score_src_list = [] 43contain_review_links = [] 44review_links = [] 45for elem in elems[4:6]: 46 time.sleep(1.0) 47 # 3のaタグがclass = 'card-product__comment'である場合のみ、先に進む 48 card_products = elem.find_elements_by_css_selector('a')[2] 49 elem_card_products = card_products.get_attribute('class') 50 if elem_card_products != 'card-product__comment': 51 continue 52 else: 53 contain_review_links.append(card_products.get_attribute('href')) 54 55for contain_review_link in contain_review_links: 56 time.sleep(1.0) 57 browser.get(contain_review_link) 58 review_lists = browser.find_elements_by_css_selector('.review-list__content') 59 for review_list in review_lists: 60 csv_list = [] 61 product_name = review_list.find_element_by_css_selector('.review-list__name').text[3:] 62 review_date_str = review_list.find_element_by_css_selector('.review-list__date').text[4:14] 63 review_date = str2date(review_date_str) 64 review_body = review_list.find_element_by_css_selector('.review-list__text').text.replace('\n','') 65 if is_yesterday(review_date): 66 csv_list.append(product_name) 67 csv_list.append(review_date) 68 csv_list.append(review_body) 69 writer.writerow(csv_list) 70 71f.close() 72browser.close()
エラー箇所
python
1line9: 2tar_date = datetime(int(result[1]), int(result[2]), int(result[3])) 3 4line66: 5review_date = str2date(review_date_str)
試したこと
print(result[1])
で年をprintした結果、
python
12020 22020 32020 42020 52020 62020 72020 8Traceback (most recent call last): 9 File "/Users/xxx/Desktop/ファイル/choice/xxx.py", line 66, in <module> 10 review_date = str2date(review_date_str) 11 File "/Users/xxx/Desktop/ファイル/choice/xxx.py", line 9, in str2date 12 tar_date = datetime(int(result[1]), int(result[2]), int(result[3])) 13TypeError: 'NoneType' object is not subscriptable
となります。
理想の結果としては、
python
12020 22020 32020 42020 52020 62020 72020 82019 92019 102019
です。
正規表現の書き方の問題なのか、調べてもこの年の取り扱いがいまいち分からず...
ご教示いただけますと幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー