iT邦幫忙

0

Python 寫入Excel 請教

  • 分享至 

  • xImage

小弟是新學Python 而且拼了個小程式.但是想進一步將資料寫到EXCEL 就是不成功.
試了openpyxl , xlwings ,xlsxwriter 都沒有成功,
請各位先進指導一下可以嗎?

我想將資料一行一行寫入到EXCEL.

from selenium import webdriver
from bs4 import BeautifulSoup


chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument('--headless')
chromeOptions.add_argument('--disable-gpu')
chromeOptions.add_argument('--disable-dev-shm-usage')
chromeOptions.add_argument('--no-sandbox')

driver = webdriver.Chrome(chrome_options=chromeOptions,executable_path="/usr/bin/chromedriver")


driver.get('https://stock360.hkej.com/indices/futures')
pageSource = driver.page_source

soup = BeautifulSoup(pageSource, 'html.parser')

#data = soup.find_all(name='td',attrs={"class":"ng-binding"})
data = soup.select('#TB_HSIF1 td')

# get the index price
for i in data: print(i.text)

以下是錯的示範

from selenium import webdriver
from bs4 import BeautifulSoup
import datetime
from openpyxl import Workbook

chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument('--headless')
chromeOptions.add_argument('--disable-gpu')
chromeOptions.add_argument('--disable-dev-shm-usage')
chromeOptions.add_argument('--no-sandbox')

driver = webdriver.Chrome(chrome_options=chromeOptions,executable_path="/usr/bin/chromedriver")


driver.get('https://stock360.hkej.com/indices/futures')
pageSource = driver.page_source

soup = BeautifulSoup(pageSource, 'html.parser')

#data = soup.find_all(name='td',attrs={"class":"ng-binding"})
data = soup.select('#TB_HSIF1 td')

# get the index price
#for i in data: print(i.text)

# write to excel
wb = Workbook()

sheet = wb.active

for i in data:
  sheet["A%d" % (i+1)].value = i + 1

wb.save('test.xlsx')

driver.quit()

Traceback (most recent call last):
File "test3.2.py", line 32, in
sheet["A%d" % (i+1)].value = i + 1
TypeError: unsupported operand type(s) for +: 'Tag' and 'int'

froce iT邦大師 1 級 ‧ 2019-05-08 11:07:45 檢舉
1.你要先把資料整理成list比較好處理。
2.openpyxl有個append可以整個把list寫入。
3.真的不會,用csv輸出。CSV簡單很多。
4.你把沒問題的code貼上來,我不知道要從那邊教起。請貼debug和原本寫出的code。

參考資料:
https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/365164/
ccutmis iT邦高手 2 級 ‧ 2019-05-08 12:32:01 檢舉
說個跟問題無關的資訊給樓主參考:
學Python網路爬虫要善用Chrome F12大法,
然後你會發現這個case不需要用到selenium跟bs4
(當然這是指目前的case,如果目標url response不是json格式的話就不適用)
舉個例 :
import requests
url="https://stock360.hkej.com/data/getWorldIndices?t=1557287885500"
r = requests.get(url)
js_obj=r.json()
print(js_obj['wdata'][0])

print出來的json_obj['wdata'][0]內容如下:
{'Symbol': '.HSI', 'ChiName': '恒生指數', 'RequestType': 'H', 'Cate': '香港指數', 'CateEng': '1_HK_IDX', 'Seq': '1', 'Price': None, 'Last': '29156.23', 'Change1': '-206.79', 'PctChange': '-0.7', 'Open': '28987.09', 'High': '29252', 'Low': '28963.83', 'PrevClose': None, 'Volume': '0', 'Turnover': '57181500000', 'WeekHigh52W': None, 'WeekLow52W': None, 'lastupdate_vendor': '2019-05-08 12:19:05', 'lastupdate': '2019-05-08 12:19:06'}

以上小小心得提供樓主參考。
zerocoke iT邦新手 5 級 ‧ 2019-05-08 12:41:13 檢舉
謝謝!收下學習
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
froce
iT邦大師 1 級 ‧ 2019-05-08 11:34:44

你debug訊息很明顯告訴你了:

Traceback (most recent call last):
File "test3.2.py", line 32, in
sheet["A%d" % (i+1)].value = i + 1  # 錯在這行
TypeError: unsupported operand type(s) for +: 'Tag' and 'int'
i是BeautifulSoup的 Tag 物件,沒辦法和 1 這個int相加

寫程式最重要是會看debug。

zerocoke iT邦新手 5 級 ‧ 2019-05-08 11:38:11 檢舉

是的, 我再努力試一下謝大大

ccutmis iT邦高手 2 級 ‧ 2019-05-08 15:02:02 檢舉

寫程式最重要是會問對問題.../images/emoticon/emoticon82.gif

我要發表回答

立即登入回答