Могут ли XPath и XQuery работать с документами HTML? - PullRequest
3 голосов
/ 24 апреля 2019

Я слышал, что документ HTML не является документом XML от https://stackoverflow.com/a/39560454.

XPath и XQuery работают с XML-документами. Могут ли они работать с документами HTML и почему?

Хотя я не знаю, почему, я думаю, XPath может работать с документами HTML, из-за https://www.quora.com/Why-do-we-use-XPath-in-Selenium-even-though-CSS-Selector-is-faster и https://html -agility-pack.net /

Ответы [ 5 ]

6 голосов
/ 24 апреля 2019

XQuery и XPath определены для работы с конкретной моделью данных, называемой XDM. В XPath 1.0 это описано в спецификации XPath; в XQuery и более поздних версиях XPath это определено в отдельной спецификации. XPath и XQuery могут работать с любыми данными, для которых определено сопоставление с XDM. XML и HTML DOM отличаются по многим деталям от XDM, но можно (с небольшим количеством прагматизма) определить отображение на XDM, и поэтому XPath можно настроить для работы как с XML, так и с HTML DOM. И действительно, оба этих отображения очень широко используются, хотя они несовершенны и в некоторых случаях неэффективны.

Самая большая проблема с отображением HTML в XDM - это пространства имен; Реализации XPath традиционно рассматривают элементы HTML, такие как «таблица» и «p», как отсутствующие в пространстве имен, поэтому можно использовать пути, такие как //table//p, без префиксов пространства имен. Но в HTML5 WhatWG решила, что эти элементы находятся в пространстве имен XHTML, что означало, что они должны были определить вариант спецификации XPath для размещения таких путей.

Селекторы CSS постепенно приобретают большую часть выразительной мощи XPath 1.0, хотя они, конечно, не так богаты, как более поздние версии, и, поскольку они предназначены в основном для HTML, а не XML, их иногда бывает удобнее использовать. Я не видел никаких данных о производительности, но производители браузеров по необходимости приложили немало усилий, чтобы сделать CSS быстрым, и, похоже, за последние 15 лет они практически не занимались разработкой своих реализаций XPath, так что это, безусловно, не Меня не удивит, если CSS быстрее в большинстве браузеров. Различия между DOM и XDM также создают накладные расходы: особенно очень неэффективное представление пространств имен в DOM.

2 голосов
/ 24 апреля 2019

В сообществе EXPath W3C есть спецификация для модуля HTTP-клиента, доступного из реализаций XPath и XQuery, который выполняет "приведение в порядок" содержимого HTML. См. http://expath.org/spec/http-client#d2e517 раздел спецификации, который описывает это:

Если тип мультимедиа является HTML-типом, содержимое очищается и анализируется (этот процесс зависит от реализации), а элемент является результирующим узлом документа.

Теперь вы можете подумать, что использовать вопрос HTTP для запроса HTML несколько обходно, но вполне естественно, что можно запросить или просмотреть документы HTML, полученные через HTTP. Это также соответствует духу независимости от процессора.

Следующий пример кода является стандартным XQuery, который будет работать на любой реализации XPath или XQuery, которая поддерживает HTTP-клиент EXPath. Он демонстрирует, как можно получить документ HTML5 (здесь, саму спецификацию HTML5, чьи незамкнутые теги, такие как <meta> делают его не правильно сформированным XML), и запросить его с помощью выражения XPath:

xquery version "3.1";

declare namespace html = "http://www.w3.org/1999/xhtml";

import module namespace http = "http://expath.org/ns/http-client";

let $url := "https://www.w3.org/TR/html5/"
return
    if (doc-available($url)) then 
        "The URL was well-formed XML. No tidying required. :)"
    else
        let $response := http:send-request(<http:request href="{$url}" method="GET"/>)
        let $response-head := $response[1]
        let $response-body := $response[2]
        return
            if (
                $response-head/http:body/@media-type eq "text/html" 
                and $response-body instance of document-node()
            ) then
                "The URL was an HTML document that was tidied into a " 
                || "well-formed XML document. :) For example: " 
                || $response-body//html:meta => head() => serialize() 
            else
                "The HTTP Client wasn't able to parse the result "
                || "into a well-formed XML document. :("

Возвращает:

The URL was an HTML document that was tidied into a well-formed XML document. :) 
For example: 
    <html:meta 
        xmlns:html="http://www.w3.org/1999/xhtml" 
        http-equiv="Content-Type" 
        content="text/html; charset=utf-8"/>

Обратите внимание, что этот элемент <meta> является правильно сформированным XML и был создан выражением XPath //html:meta. (Я проверял это в eXist. Тот же код работает в BaseX, за исключением того, что выражение //meta, поскольку BaseX не приводит приведенный в порядок HTML-код в пространство имен HTML, как eXist.)

Я должен добавить, что спецификация HTTP Client оставляет процессорам возможность определять «порядок», поэтому, безусловно, будут различия между реализациями, но если вопрос «Могут ли XPath и XQuery работать с документами HTML?», это демонстрирует, что они могут, и они могут делать это только с независимыми от процессора спецификациями - с оговоркой, доказанной здесь, что разные реализации могут интерпретировать спецификацию по-разному.

2 голосов
/ 24 апреля 2019

HTML не гарантирует правильности, поэтому анализатор XML, скорее всего, не сможет его проанализировать (если вы не используете очень ограниченное подмножество HTML).Тем не менее, XHTML является правильно сформированным двоюродным братом HTML, и, насколько я знаю, работает в браузерах с тем же набором функций (см .: https://www.w3.org/TR/html-polyglot/).

Но если у вас уже есть HTML, то вам понадобитсяпреобразовать его в XML для использования XPath / XQuery. Существуют различные реализации «HTML tidy» с возможностью вывода действительного XML, который должен работать. Возможно, в вашем процессоре XQuery доступна некоторая форма tidy. Если нет, то существует много языков.и автономные реализации, которые, вероятно, могут привести вас туда.

1 голос
/ 25 апреля 2019

Когда я захотел использовать XPath (более новый, чем XPath 1.0) в документе HTML, я написал полный интерпретатор XQuery для HTML .

Помимо стандартного XQuery 3.0 я добавил несколько необязательных расширений (которые на самом деле не разрешены, но полезны для HTML), таких как сопоставление имен узлов без учета регистра или более удобное использование пространств имен.

1 голос
/ 24 апреля 2019

Действительно, Xpath может использоваться против HTML-документа.Некоторые примеры пакетов / модулей / приложений, которые делают это

  • Драйвер Selenium
  • lxml на python (на основе libxml2)
  • xmllint на bash (на основе libxml2)
...