答案页 · 12 道题

Python HTML 解析练习答案

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

快速答案

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

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

01 · 选择题

哪个方法处理开始标签?

  1. handle_endtag
  2. handle_comment
  3. handle_data
  4. handle_starttag正确答案

答案: handle_starttag

为什么: handle_starttag 接收标签名和属性键值对。

02 · 选择题

attrs 参数是什么?

  1. 单个字符串
  2. 字典
  3. 由 (名称, 值) 组成的列表正确答案
  4. 子标签列表

答案: 由 (名称, 值) 组成的列表

为什么: 需要按属性名查找时,用 dict 转换 attrs。

03 · 选择题

哪个方法接收标签之间的文本?

  1. handle_endtag
  2. handle_starttag
  3. handle_data正确答案
  4. feed

答案: handle_data

为什么: handle_data 接收标签之间找到的文本节点。

04 · 选择题

运行结果是什么?

from html.parser import HTMLParser
class P(HTMLParser):
    def __init__(self):
        super().__init__()
        self.tags = []
    def handle_starttag(self, tag, attrs):
        self.tags.append(tag)
p = P()
p.feed("<h1>A</h1><p>B</p>")
print(p.tags)
  1. ['h1', 'p']正确答案
  2. []
  3. ['A', 'B']
  4. ['h1']

答案: ['h1', 'p']

为什么: 处理器按文档顺序记录每个开始标签的名称。

05 · 填空题

补全 HTML 解析器导入。

from html.parser import ____

答案: HTMLParser

为什么: HTMLParser 是标准库提供的解析器基类。

06 · 填空题

补全自定义解析器的基类。

from html.parser import HTMLParser
class P(____):
    def handle_starttag(self, tag, attrs):
        print(tag)
p = P()
p.feed("<a href='/a'>A</a>")

答案: HTMLParser

为什么: 自定义解析器继承 HTMLParser。

07 · 填空题

补全处理 HTML 文本的调用。

from html.parser import HTMLParser
class P(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print(tag)
p = P()
p.____("<a href='/a'>A</a>")

答案: feed

为什么: feed 把 HTML 字符串送入解析器。

08 · 填空题

补全处理开始标签的方法名。

from html.parser import HTMLParser
class P(HTMLParser):
    def ____(self, tag, attrs):
        print(tag)
p = P()
p.feed("<a href='/a'>A</a>")

答案: handle_starttag

为什么: handle_starttag 会在每个开始标签处调用。

09 · 输出预测

这段程序打印出什么?

from html.parser import HTMLParser
class P(HTMLParser):
    def __init__(self):
        super().__init__()
        self.links = []
    def handle_starttag(self, tag, attrs):
        values = dict(attrs)
        if tag == "a" and values.get("href"):
            self.links.append(values["href"])
p = P()
p.feed('<a href="/a">A</a><a href="/b">B</a>')
print(p.links)

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

为什么: 两个 a 标签都有 href 属性,所以两个值都会被收集。

10 · 输出预测

代码的输出结果是什么?

from html.parser import HTMLParser
class P(HTMLParser):
    def __init__(self):
        super().__init__()
        self.parts = []
    def handle_data(self, data):
        text = data.strip()
        if text:
            self.parts.append(text)
p = P()
p.feed("<h1>Title</h1><p>Body</p>")
print(" | ".join(p.parts))

答案: Title | Body

为什么: 两个非空文本节点用竖线连接。

11 · 输出预测

屏幕上会显示什么?

from html.parser import HTMLParser
class P(HTMLParser):
    def __init__(self):
        super().__init__()
        self.count = 0
    def handle_starttag(self, tag, attrs):
        if tag == "a":
            self.count += 1
p = P()
p.feed('<a href="/a">A</a><a href="/b">B</a>')
print(p.count)

答案: 2

为什么: 解析器遇到两个开始 a 标签。

12 · 输出预测

这段代码会输出什么?

from html import unescape
print(unescape("Tom &amp; Jerry"))

答案: Tom & Jerry

为什么: unescape 把 &amp; 字符引用转换成 &。

先试一遍题目

打开 Python HTML 解析 练习页,用即时反馈回答同样的 12 道题。

练习本课