前提・実現したいこと
PythonのSeleniumでデータの抽出を作成しています。
Python
1[print(i, item) for i, item in enumerate(item_list)]
上記を実行後に以下のようにしたいのですが、うまくできませんでした。
良い方法を教えていただけますでしょうか。
0 ['hogehoge-1', '¥9,000']
1 ['hogehoge-1SS', '¥13,500']
2 ['hogehoge-2', '¥12,000']
3 ['hogehoge-2SS', '¥18,000']
4 ['hogehoge-3', '¥13,000']
[None, None, None, None, None]
該当のソースコード
Python
1from selenium.webdriver.chrome.options import Options 2from selenium import webdriver 3import chromedriver_binary 4import time 5 6options = Options() 7options.add_argument('--incognito') 8options.add_argument('--blink-settings=imagesEnabled=false') 9driver = webdriver.Chrome(chrome_options=options) 10driver.implicitly_wait(60) 11driver.get("https://www.hogehoge.com/") 12time.sleep(3) 13 14from datetime import datetime 15import openpyxl as px 16from openpyxl.styles import PatternFill 17from bs4 import BeautifulSoup as bs4 18import re 19 20def Pagecrawling(soup, item_list): 21 ### ※1 22 products = soup.find_all('div', class_=re.compile('item_info_area')) 23 ### ※1 24 for product in products: 25 Knumber = product.find_all('p', class_=re.compile('pronumber')) 26 Kprice = product.find_all('em', ) 27 for (numnum, pripri) in zip (Knumber, Kprice): 28 number = numnum.get_text().replace('\n', '') 29 price = pripri.get_text() 30 item_list.append([number, price]) 31 return item_list 32 33r = driver.page_source 34soup = bs4(r,'lxml') 35item_list = [] 36item_list = Pagecrawling(soup, item_list) 37 38### ※2 39[print(i, item) for i, item in enumerate(item_list)] 40### ※2
### ※1で抽出されるデータ
[<div class="item_info_area"> <div> <p class="pronumber">品番</p>hogehoge-1<br/> <p class="price">価格(税別) </p><em>¥9,000</em> </div> </div>, <div class="item_info_area"> <div> <p class="pronumber">品番</p>hogehoge-1SS<br/> <p class="price">価格(税別) </p><em>¥13,500</em> </div> </div>, <div class="item_info_area"> <div> <p class="pronumber">品番</p>hogehoge-2<br/> <p class="price">価格(税別) </p><em>¥12,000</em> </div> </div>, <div class="item_info_area"> <div> <p class="pronumber">品番</p>hogehoge-2SS<br/> <p class="price">価格(税別) </p><em>¥18,000</em> </div> </div>, <div class="item_info_area"> <div> <p class="pronumber">品番</p>hogehoge-3<br/> <p class="price">価格(税別) </p><em>¥13,000</em> </div> </div>, <div class="item_info_area"> </div>]
### ※2で出力されるデータ
###見やすくするためのコメント### 0 ['品番', '¥9,000'] 1 ['品番', '¥13,500'] 2 ['品番', '¥12,000'] 3 ['品番', '¥18,000'] 4 ['品番', '¥13,000'] [None, None, None, None, None]
試した内容
- BeautifulSoupでタグで囲まれていないテキストを取得する方法
- Python テキストのみスクレイピングする方法について
- .strings
- .next_sibling
上記をヒントに
for product in products: Kprice = product.find_all(class_="pronumber").text print(Kprice)
としてみましたが
Traceback (most recent call last): File "<stdin>", line 2, in <module> File "C:\Users\hogehoge\AppData\Local\Programs\Python\Python38-32\lib\site-packages\bs4\element.py", line 2173, in __getattr__ raise AttributeError( AttributeError: ResultSet object has no attribute 'text'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?
とエラーが返ってきました。
補足情報(FW/ツールのバージョンなど)
- Python 3.8.7(32bit)
- ChromeDriver 87.0.4280.20
- 必要のない宣言がありますが、記載したコード以降で使いますので気にしないでください。
- パソコンスキルの教科書様のサイトを参考にコードを作成しました。
ttp://fastclassinfo.com/entry/yahooauction_python/
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/02/07 23:56