答案頁 · 12 道題

Python 分頁與去重練習答案

本頁彙整 Python 分頁與去重 的 12 道練習。先做練習頁,再回到這裡核對準確答案和原因。

快速答案

本答案頁包含 Python 分頁與去重 的 4 道選擇題、4 道填空題和 4 道輸出預測題,每題都給出準確答案和簡短解釋。

答案已完整展示,建議先嘗試作答,再用本頁核對。第一次練習最好從互動練習頁開始。

01 · 選擇題

抓取時為什麼要維護 visited 集合?

  1. 儲存 HTML
  2. 修改 User-Agent
  3. 按字母排序頁面
  4. 避免環和重複頁面正確答案

答案: 避免環和重複頁面

為什麼: visited 集合記錄已經處理過的 URL。

02 · 選擇題

哪個 deque 方法刪除最左端元素?

  1. removeleft()
  2. popleft()正確答案
  3. pop()
  4. shift()

答案: popleft()

為什麼: popleft 從隊首刪除,為佇列提供先進先出順序。

03 · 選擇題

為什麼要設定最大頁面數?

  1. 解碼 HTML 實體
  2. 限制工作量,阻止抓取失控正確答案
  3. 刪除查詢字串
  4. 讓 URL 更短

答案: 限制工作量,阻止抓取失控

為什麼: 即使連結不斷出現,頁面預算也是簡單的停止條件。

04 · 選擇題

這段程式列印出什麼?

from collections import deque
pages = {"/1": ["/2", "/a"], "/2": ["/b"]}
queue = deque(["/1"])
seen = []
while queue and len(seen) < 3:
    url = queue.popleft()
    if url in seen:
        continue
    seen.append(url)
    queue.extend(pages.get(url, []))
print(seen)
  1. ['/1', '/2', '/a']正確答案
  2. ['/1', '/2', '/a', '/b']
  3. ['/1', '/a', '/2']
  4. ['/2', '/1', '/a']

答案: ['/1', '/2', '/a']

為什麼: 廣度優先佇列先存取 /1,再存取它的連結 /2 和 /a,到三個頁面的預算時停止。

05 · 填空題

補全佇列型別。

from collections import deque
queue = ____(["/1", "/2"])
print(queue.popleft())

答案: deque

為什麼: deque 支援高效 append 和 popleft 操作。

06 · 填空題

補全取出下一個 URL 的方法。

from collections import deque
queue = deque(["/1", "/2"])
print(queue.____())

答案: popleft

為什麼: popleft 從 deque 左端取出元素。

07 · 填空題

補全集合插入呼叫。

seen = set()
url = "/a"
seen.____(url)
print(len(seen))

答案: add

為什麼: Set.add 把 URL 記錄為已存取。

08 · 填空題

補全成員判斷。

seen = {"/a"}
url = "/a"
print(url in ____)

答案: seen

為什麼: 檢查 visited 集合可以避免重複存取。

09 · 輸出預測

程式碼的輸出結果是什麼?

links = ["/a", "/b", "/a"]
print(list(dict.fromkeys(links)))

答案: ['/a', '/b']

為什麼: dict.fromkeys 在去重的同時保留首次出現順序。

10 · 輸出預測

螢幕上會顯示什麼?

pages = {"/1": ["/2"], "/2": ["/3"], "/3": []}
queue = ["/1"]
seen = []
while queue:
    url = queue.pop(0)
    if url in seen:
        continue
    seen.append(url)
    queue.extend(pages.get(url, []))
print(seen)

答案: ['/1', '/2', '/3']

為什麼: 佇列按廣度優先順序存取每個頁面一次。

11 · 輸出預測

這段程式碼會輸出什麼?

seen = set()
for url in ["/a", "/a", "/b"]:
    seen.add(url)
print(len(seen))

答案: 2

為什麼: 集合包含兩個唯一 URL。

12 · 輸出預測

執行結果是什麼?

from urllib.parse import urlsplit, urlunsplit
parts = urlsplit("https://example.com/guide.html#top")
print(urlunsplit((parts.scheme, parts.netloc, parts.path, parts.query, "")))

答案: https://example.com/guide.html

為什麼: 把片段替換為空字串會去掉 #top。

先試一遍題目

打開 Python 分頁與去重 練習頁,用即時回饋回答同樣的 12 道題。

練習本課