答案頁 · 12 道題

Python HTML 解析練習答案

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

快速答案

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

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

01 · 選擇題

哪個方法處理開始標籤?

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

答案: handle_starttag

為什麼: handle_starttag 接收標籤名和屬性鍵值對。

02 · 選擇題

attrs 參數是什麼?

  1. 子標籤列表
  2. 由 (名稱, 值) 組成的列表正確答案
  3. 單個字串
  4. 字典

答案: 由 (名稱, 值) 組成的列表

為什麼: 需要按屬性名尋找時,用 dict 轉換 attrs。

03 · 選擇題

哪個方法接收標籤之間的文字?

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

答案: 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. ['A', 'B']
  2. ['h1']
  3. ['h1', 'p']正確答案
  4. []

答案: ['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 道題。

練習本課