本答案頁包含 Python 分頁與去重 的 4 道選擇題、4 道填空題和 4 道輸出預測題,每題都給出準確答案和簡短解釋。
答案已完整展示,建議先嘗試作答,再用本頁核對。第一次練習最好從互動練習頁開始。
抓取時為什麼要維護 visited 集合?
答案: 避免環和重複頁面
為什麼: visited 集合記錄已經處理過的 URL。
哪個 deque 方法刪除最左端元素?
答案: popleft()
為什麼: popleft 從隊首刪除,為佇列提供先進先出順序。
為什麼要設定最大頁面數?
答案: 限制工作量,阻止抓取失控
為什麼: 即使連結不斷出現,頁面預算也是簡單的停止條件。
這段程式列印出什麼?
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', '/2', '/a']
為什麼: 廣度優先佇列先存取 /1,再存取它的連結 /2 和 /a,到三個頁面的預算時停止。
補全佇列型別。
from collections import deque
queue = ____(["/1", "/2"])
print(queue.popleft())答案: deque
為什麼: deque 支援高效 append 和 popleft 操作。
補全取出下一個 URL 的方法。
from collections import deque
queue = deque(["/1", "/2"])
print(queue.____())答案: popleft
為什麼: popleft 從 deque 左端取出元素。
補全集合插入呼叫。
seen = set()
url = "/a"
seen.____(url)
print(len(seen))答案: add
為什麼: Set.add 把 URL 記錄為已存取。
補全成員判斷。
seen = {"/a"}
url = "/a"
print(url in ____)答案: seen
為什麼: 檢查 visited 集合可以避免重複存取。
程式碼的輸出結果是什麼?
links = ["/a", "/b", "/a"]
print(list(dict.fromkeys(links)))答案: ['/a', '/b']
為什麼: dict.fromkeys 在去重的同時保留首次出現順序。
螢幕上會顯示什麼?
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']
為什麼: 佇列按廣度優先順序存取每個頁面一次。
這段程式碼會輸出什麼?
seen = set()
for url in ["/a", "/a", "/b"]:
seen.add(url)
print(len(seen))答案: 2
為什麼: 集合包含兩個唯一 URL。
執行結果是什麼?
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 道題。