在 Day 6.欸 今天要幹嘛 - 優化、整理中學習的時候,
優化程式碼過程只有稍微帶過enumerate() 迭代過程中同時獲取元素的索引和值
。
後來一些因素讓我需要再整理、改變寫法enumerate()
問題如下圖,雖然已經標明頁數等等很明確資訊,但如果可以有個分隔線,絕對會在視覺上很有幫助。
利用 print("-" * 40) 就可以產生 40個 dash
authors_per_page = 10
if idx % authors_per_page == 0:
print("-" * 40)
idx(索引值)除以 authors_per_page(每頁作者數目),如果餘數為 0,就下分隔線 print("-" * 40)
。
結果發線切的位子不對!噢不
後來發現是前面程式碼在處理enumerate()
的時候,
是利用 print(f"Page {page}, Index {idx + 1 }. Author: {author.text}")
,
然後 idx + 1 會跑掉座標,這時就追朔到本身enumerate()
的使用方式。
enumerate 具有舉出、計算、列舉的意思
而 enumerate()
是一個內建函數
用於將可迭代對象(例如列表、元組或字符串)的元素與它們的索引配對。
它通常在迴圈中使用,以便同時獲取元素和它們的索引值。enumerate(iterable, start=0)
iterable:要枚舉(遍歷)的可迭代對象,例如列表、元組、字符串等。
start(可自訂):設定索引的起始值。默認情況下,起始值為 0。
回到要修改的程式碼上,只要是當初使用enumerate()
沒有設定起始點,默認 0。
在出書的處理方式為
修改這行⬇️⬇️⬇️ print(f"Page {page}, Index {idx + 1 }. Author: {author.text}")
應該要變成這樣⬇️⬇️⬇️ print(f"Page {page}, Index {idx}. Author: {author.text}")
附上最終效果及程式碼
import requests
from bs4 import BeautifulSoup
base_url = "https://astro.5xruby.tw/testimony/"
num_pages = 7
import time
for page in range(1,num_pages + 1):
if page == 1:
page_url = base_url
else:
page_url = f"{base_url}page/{page}"
response = requests.get(page_url)
response.encoding = "utf-8"
if response.status_code == 200:
soup = BeautifulSoup(response.text, "html.parser")
author_infos = soup.find_all("h4", class_="is-author")
authors_per_page = 10
for idx, author in enumerate(author_infos,1):
print(f"Page {page}, Index {idx}. Author: {author.text}")
if idx % authors_per_page == 0:
print("-" * 40)
else:
print(f"Failed to retrieve page {page_url}")
time.sleep(1)