iT邦幫忙

0

我想用python寫入excel中但出了問題

  • 分享至 

  • xImage

不知為何我執行後我的貼文全部被吃掉只剩下最後一句,求大神幫個忙 感恩
後來我改用list讀取excel一樣被吃掉呢
<更新提供部分程式碼>
程式碼提供如下:

# 捲動
for x in range(5):
    chrome.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    time.sleep(5)
 
soup = BeautifulSoup(chrome.page_source, 'html.parser')
print("------------我是分隔線---------------")

titles = soup.find_all(
    "div", class_="ecm0bbzt")
for title in titles:
    # 定位每一行標題
    posts = title.find_all("div", dir="auto")
    # 如果有文章標題才印出
    if len(posts):
        for post in posts:
          q1=post.text
          a_list =[q1]
          print(a_list)
          
        print("------------我是分隔線---------------")
import csv
with open('songs.csv', 'w', newline='', encoding="big5") as csvfile:
    # 建立 CSV 檔寫入器
    writer = csv.writer(csvfile)
    # 寫入一列資料
    writer.writerow(["貼文"])
    
    ...
    
    writer.writerow([a_list])        
        
# 建立資料夾
import os
import requests
if not os.path.exists("images"):
    os.mkdir("images")

# 下載圖片
images = soup.find_all(
    "img", class_=["i09qtzwb n7fi1qx3 datstx6m pmk7jnqg j9ispegn kr520xx4 k4urcfbm bixrwtb6", "i09qtzwb n7fi1qx3 datstx6m pmk7jnqg j9ispegn kr520xx4 k4urcfbm"])
if len(images) != 0:
    for index, image in enumerate(images):
        img = requests.get(image["src"])
        with open(f"images/img{index+1}.jpg", "wb") as file:
            file.write(img.content)
        print(f"第 {index+1} 張圖片下載完成!")

# 等待5秒
time.sleep(5)
# 關閉瀏覽器
chrome.quit()

https://ithelp.ithome.com.tw/upload/images/20220126/20145979tIiK7gWHUF.png

看更多先前的討論...收起先前的討論...
1092B0007 iT邦新手 3 級 ‧ 2022-01-26 20:13:42 檢舉
'
with open('songs.csv', 'w', newline='', encoding="big5") as csvfile:
這一段應該要拉到迴圈外做喔,不然就會一直重新創新的songs.csv檔接著寫入貼文加本次的內容,所以你最後只看到貼文、最後一行內容是正常的
另外你可以先把抓到的內容存成list在一次寫入EXCEL,可以加速整個寫入的時間
阿誠 iT邦新手 5 級 ‧ 2022-01-27 11:05:56 檢舉
@camelcheng 謝謝你,但我是在迴圈外做的阿 ,而且我放到list裡面後excel依樣只有最後一句呢...
第一個問題的地方:
a_list=[q1] 要改成 a_list.append([q1])
原本的寫法會導致a_list每一次值都會被覆蓋,只會剩下最後一筆的[q1],這邊要用append加入list
另外 print(a_list)要放在迴圈外,其實就可以很容易看出,a_list裡面的值其實都只有一筆

第二個問題的地方:
writer.writerow([a_list]) 改成 writer.writerows(a_list)
這邊因為是要一次寫入多行內容,所以要用writerows(a_list)

這兩邊改一下再試試看
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2022-01-27 09:10:16

https://ithelp.ithome.com.tw/upload/images/20220127/200017879YeqaHq2Ak.png

先猜一個

writer.writerow([q1.text])

搬到

print(q1.text)

的前一列試試看

阿誠 iT邦新手 5 級 ‧ 2022-01-27 10:47:10 檢舉

謝謝你 不過並沒有解決根本問題

淺水員 iT邦大師 6 級 ‧ 2022-01-27 11:32:10 檢舉

看錯,自刪

0
camelcheng
iT邦新手 4 級 ‧ 2022-01-27 10:18:21

解法就這樣

import csv
titles = soup.find_all("div", class_="ecm0bbzt")
for title in titles:
    posts = title.find_all("div", dir="auto")
if len(posts):
    with open('songs.csv', 'w', newline='', encoding="big5") as csvfile:
        # 建立 CSV 檔寫入器
        writer = csv.writer(csvfile)
        for post in posts:
            q1=post
            print(q1.text)
            print("------------我是分隔線---------------")
            writer.writerow([q1.text])
看更多先前的回應...收起先前的回應...
阿誠 iT邦新手 5 級 ‧ 2022-01-27 10:45:01 檢舉

謝謝你 不過我測試後的成果沒抓到內文 excel也沒任何變化呢https://ithelp.ithome.com.tw/upload/images/20220127/20145979eYg4hHyhV2.png

import csv

posts= ["第一篇","第二篇", "第三篇", "第四篇"]

if len(posts):
    with open('songs.csv', 'w', newline='', encoding="big5") as csvfile:
        # 建立 CSV 檔寫入器
        writer = csv.writer(csvfile)
        for post in posts:
            q1=post
            print(q1)
            print("------------我是分隔線---------------")
            writer.writerow([q1])

https://ithelp.ithome.com.tw/upload/images/20220127/20146086mRrTqxkZpS.png
我帶假資料來測試EXCEL寫入這一段應該要是對的才對,能貼看看你的code嗎?

阿誠 iT邦新手 5 級 ‧ 2022-01-27 11:08:10 檢舉

code 我放在本貼文了若再不行我再貼完整的給你好嗎?

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time

options = webdriver.ChromeOptions()
# options.add_argument("--headless") #不開啟實體瀏覽器背景執行
options.add_argument("--start-maximized") #最大化視窗
options.add_argument("--incognito") #開啟無痕模式
options.add_argument("--disable-popup-blocking ") #禁用彈出攔截

# 使用 Chrome 的 WebDriver
chrome = webdriver.Chrome(options = options)
options.add_argument("--disable-notifications")
# 'C:\\Users\\USER\\AppData\\Local\\Programs\\Python\\Python310\\Scripts\\chromedriver.exe'

chrome.get("https://www.facebook.com/")

email = chrome.find_element_by_id("email")
password = chrome.find_element_by_id("pass")

email.send_keys('your fb account')
password.send_keys('your password')
password.submit()

time.sleep(10)

# 螢幕最大化
chrome.maximize_window()
chrome.get('https://www.facebook.com/search/top?q=%E7%AB%B9%E8%BC%AA%E9%9B%BB%E5%8B%95%E8%BB%8A')

# 捲動
for x in range(5):
    chrome.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    time.sleep(2)

soup = BeautifulSoup(chrome.page_source, 'html.parser')
print("------------我是分隔線---------------")

titles = soup.find_all("div", class_="ecm0bbzt")
import csv
with open('songs.csv', 'w', newline='', encoding="BIG5", errors='ignore') as csvfile:
    # 建立 CSV 檔寫入器
    writer = csv.writer(csvfile)
    # 寫入一列資料
    writer.writerow(["貼文"])
    if titles:
        for title in titles:
            #將貼文內容寫入到EXCEL檔案裡
            print(title.find(dir="auto").text)
            writer.writerow([title.find(dir="auto").text])
            

print("------------我是分隔線---------------")


# 建立資料夾
import os
import requests
if not os.path.exists("images"):
    os.mkdir("images")

# 下載圖片
images = soup.find_all(
"img", class_=["i09qtzwb n7fi1qx3 datstx6m pmk7jnqg j9ispegn kr520xx4 k4urcfbm bixrwtb6", "i09qtzwb n7fi1qx3 datstx6m pmk7jnqg j9ispegn kr520xx4 k4urcfbm"])
if len(images) != 0:
    for index, image in enumerate(images):
        img = requests.get(image["src"])
        with open(f"images/img{index+1}.jpg", "wb") as file:
            file.write(img.content)
        print(f"第 {index+1} 張圖片下載完成!")

# 等待5秒
time.sleep(5)
# 關閉瀏覽器
chrome.quit()

完整的code補在這邊囉,請樓主大大自行參考^^

阿誠 iT邦新手 5 級 ‧ 2022-01-27 17:02:47 檢舉

大大我的會出錯...到底是為什麼呢?https://ithelp.ithome.com.tw/upload/images/20220127/20145979q7OBB8qGnE.png

我要發表回答

立即登入回答