前提・実現したいこと
元同僚がRを使って書いたコードをPythonで書き直しています(Windows, pycharm使用)。
プログラミング初心者です。
元々のコードの目的は、Seleniumを使って、
①ログインが必要なサイトに行き、ログイン後、
②データを得て、
③それをcsvとして保存
④ ②③の繰り返し
という動作を自動化するというものです。
現在、②まで出来ていて、③がうまくいきません。
元のコード(R)では、リクエストして得たデータのテキスト部分を抽出し、それをそのままcsvとして出力しているようです(下記参照)。
#Send query
OutputData<-remDr$findElement(using='css selector',"body")$getElementText()
#Save the output as a csv file
write.table(OutputData[[1]],paste("c:\temp\",agentNo,".csv",sep=""))
私はこれを以下のように書き換えました。
html = browser.page_source
soup = bs(html, "lxml")
body = soup.find("body")
result = body.text
この時点でprint(result)で表示されるものは、私の求めている結果そのものです。
そして以下のようにcsvとして出力しました。
df = pd.DataFrame(data=body)
df.to_csv('4843.csv')
結果、(少し余計なものが混ざってはいますが)、Pycharm上とNotepad++上でcsvを確認することができました。
が、Excelでcsvを開くと、Pycharm上で見えた最初の2列分のデータしか見れません。
データはそこにあるはずなのに、なぜかExcelでは見えないという状況です。
Dataframeの使い方が間違っているのか、他の方法でやったほうがいいのか、アドバイスいただけますでしょうか。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome import service as fs import time import pandas as pd from bs4 import BeautifulSoup as bs CHROMEDRIVER = 'C:/Users/xxx/Python/chromedriver_win32/chromedriver.exe' chrome_service = fs.Service(executable_path=CHROMEDRIVER) browser = webdriver.Chrome(service=chrome_service) # Access cliflo browser.get('https://cliflo.niwa.co.nz') time.sleep(2) # Login browser.find_element(By.NAME, 'cusername').send_keys('xxx') browser.find_element(By.NAME, 'cpwd').send_keys('xxx') elem = browser.find_element(By.NAME, 'submit') elem.click() time.sleep(10) # Request data browser.find_element(By.NAME, 'sub_delalldt').click() browser.get("https://cliflo.niwa.co.nz/pls/niwp/wgenf.genform1?cdt=ls_ra&cadd=t") ## Clear text box inputs first browser.find_element(By.NAME, 'agents').clear() browser.find_element(By.NAME, 'date1_1').clear() browser.find_element(By.NAME, 'date1_2').clear() browser.find_element(By.NAME, 'date1_3').clear() browser.find_element(By.NAME, 'date2_1').clear() browser.find_element(By.NAME, 'date2_2').clear() browser.find_element(By.NAME, 'date2_3').clear() browser.find_element(By.NAME, 'agents').send_keys('4843') browser.find_element(By.NAME, 'date1_1').send_keys('2022') browser.find_element(By.NAME, 'date1_2').send_keys('07') browser.find_element(By.NAME, 'date1_3').send_keys('30') browser.find_element(By.NAME, 'date2_1').send_keys('2022') browser.find_element(By.NAME, 'date2_2').send_keys('07') browser.find_element(By.NAME, 'date2_3').send_keys('31') ##Separate date and time columns browser.find_element(By.XPATH, "//*/input[@value='Y']").click() browser.find_element(By.NAME, 'mimeselection').send_keys('Comma Delimited (text/plain)') browser.find_element(By.NAME, 'cstn_id').send_keys('Lat/Long') browser.find_element(By.NAME, 'submit_sq').click() html = browser.page_source soup = bs(html, "lxml") body = soup.find("body") result = body.text print(result) df = pd.DataFrame(data=body) df.to_csv('4843.csv')
試したこと
代わりにcsvモジュールを使って、そのままresultを出力できないかと思いましたが、うまくいきませんでした。
0 コメント