33.30 解析 HTML 和 XML

Emacs 可编译为内置 libxml2 支持的版本。

Function: libxml-available-p

若当前 Emacs 会话中启用了内置 libxml2 支持, 该函数返回非 nil 值。

当 libxml2 支持可用时,可使用以下函数将 HTML 或 XML 文本解析为 Lisp 对象树。

Function: libxml-parse-html-region &optional start end base-url discard-comments

该函数将 startend 之间的文本解析为 HTML,并返回表示 HTML 解析树(parse tree) 的列表。 该函数可鲁棒地处理语法错误,以适配实际场景中的 HTML 文本。

startendnil,则分别默认使用 point-minpoint-max 的值。

可选参数 base-url 若非 nil, 将用于 libxml2 库输出的警告和错误信息, 但 Emacs 目前调用该库时会禁用错误和警告输出,因此该参数暂未启用。

若可选参数 discard-commentsnil, 则所有顶级注释都会被丢弃。(该参数已过时, 将在未来的 Emacs 版本中移除。如需移除注释, 请在调用解析函数前使用 xml-remove-comments 工具函数处理数据。)

在解析树中,每个 HTML 节点由一个列表表示:列表第一个元素是表示节点名称的符号, 第二个元素是节点属性的关联列表(alist),其余元素为子节点。

以下示例展示这一结构。对于如下(格式不规范的)HTML 文档:

<html><head></head><body width=101><div class=thing>Foo<div>Yes

调用 libxml-parse-html-region 将返回如下 DOM (文档对象模型):

(html nil
 (head nil)
 (body ((width . "101"))
  (div ((class . "thing"))
   "Foo"
   (div nil
    "Yes"))))
Function: shr-insert-document dom

该函数将 dom 中已解析的 HTML 渲染到当前 缓冲区中。参数 dom 应为 libxml-parse-html-region 生成的列表。 例如,EWW in The Emacs Web Wowser Manual 就使用了此函数。

Function: libxml-parse-xml-region &optional start end base-url discard-comments

该函数与 libxml-parse-html-region 功能相同, 区别在于它将文本解析为 XML(而非 HTML),因此对语法要求更严格。