本答案页包含 Python HTML 解析 的 4 道选择题、4 道填空题和 4 道输出预测题,每题都给出准确答案和简短解释。
答案已完整展示,建议先尝试作答,再用本页核对。第一次练习最好从互动练习页开始。
哪个方法处理开始标签?
答案: handle_starttag
为什么: handle_starttag 接收标签名和属性键值对。
attrs 参数是什么?
答案: 由 (名称, 值) 组成的列表
为什么: 需要按属性名查找时,用 dict 转换 attrs。
哪个方法接收标签之间的文本?
答案: handle_data
为什么: handle_data 接收标签之间找到的文本节点。
运行结果是什么?
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)答案: ['h1', 'p']
为什么: 处理器按文档顺序记录每个开始标签的名称。
补全 HTML 解析器导入。
from html.parser import ____答案: HTMLParser
为什么: HTMLParser 是标准库提供的解析器基类。
补全自定义解析器的基类。
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。
补全处理 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 字符串送入解析器。
补全处理开始标签的方法名。
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 会在每个开始标签处调用。
这段程序打印出什么?
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 属性,所以两个值都会被收集。
代码的输出结果是什么?
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
为什么: 两个非空文本节点用竖线连接。
屏幕上会显示什么?
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 标签。
这段代码会输出什么?
from html import unescape
print(unescape("Tom & Jerry"))答案: Tom & Jerry
为什么: unescape 把 & 字符引用转换成 &。
先试一遍题目
打开 Python HTML 解析 练习页,用即时反馈回答同样的 12 道题。