答案页 · 12 道题

Python 分页与去重练习答案

本页汇总 Python 分页与去重 的 12 道练习。先做练习页,再回到这里核对准确答案和原因。

快速答案

本答案页包含 Python 分页与去重 的 4 道选择题、4 道填空题和 4 道输出预测题,每题都给出准确答案和简短解释。

答案已完整展示,建议先尝试作答,再用本页核对。第一次练习最好从互动练习页开始。

01 · 选择题

抓取时为什么要维护 visited 集合?

  1. 按字母排序页面
  2. 修改 User-Agent
  3. 避免环和重复页面正确答案
  4. 保存 HTML

答案: 避免环和重复页面

为什么: visited 集合记录已经处理过的 URL。

02 · 选择题

哪个 deque 方法删除最左端元素?

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

答案: popleft()

为什么: popleft 从队首删除,为队列提供先进先出顺序。

03 · 选择题

为什么要设置最大页面数?

  1. 解码 HTML 实体
  2. 让 URL 更短
  3. 删除查询字符串
  4. 限制工作量,阻止抓取失控正确答案

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

为什么: 即使链接不断出现,页面预算也是简单的停止条件。

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', '/a', '/2']
  2. ['/1', '/2', '/a']正确答案
  3. ['/1', '/2', '/a', '/b']
  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 道题。

练习本课