33.30 Разбор HTML и XML

Emacs может быть скомпилирован с поддержкой встроенной libxml2.

Функция: libxml-available-p

Эта функция возвращает не-nil, если встроенная поддержка libxml2 доступна в этой сессии Emacs.

Когда поддержка libxml2 доступна, можно использовать следующие функции для разбора текста HTML или XML в древовидные объекты Lisp.

Функция: libxml-parse-html-region &optional start end base-url discard-comments

Эта функция разбирает текст между start и end как HTML и возвращает список, представляющий дерево разбора HTML. Она пытается обрабатывать HTML реального мира, надежно справляясь с синтаксическими ошибками.

Если start или end равны nil, по умолчанию используются значения point-min и point-max соответственно.

Необязательный аргумент base-url, если он не равен nil, следует использовать для предупреждений и ошибок, сообщаемых библиотекой libxml2, но Emacs в настоящее время вызывает библиотеку с отключенными ошибками и предупреждениями, поэтому этот аргумент не используется.

Если необязательный аргумент discard-comments не равен nil, любой комментарий верхнего уровня отбрасывается. (Этот аргумент устарел и будет удален в будущих версиях Emacs. Чтобы удалить комментарии, используйте утилиту xml-remove-comments для данных перед вызовом функции разбора.)

В дереве разбора каждый HTML-узел представляется списком, в котором первый элемент — это символ, представляющий имя узла, второй элемент — это список атрибутов узла, а остальные элементы — дочерние узлы.

Пример ниже демонстрирует это. При заданном (некорректном) 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"))))
Функция: shr-insert-document dom

Эта функция отображает разобранный HTML в dom в текущем буфере. Аргумент dom должен быть списком, сгенерированным libxml-parse-html-region. Эта функция, например, используется EWW в Руководстве по Emacs Web Wowser.

Функция: libxml-parse-xml-region &optional start end base-url discard-comments

Эта функция аналогична libxml-parse-html-region, за исключением того, что она разбирает текст как XML, а не HTML (поэтому она более строга в отношении синтаксиса).