Я искал решение, но ничего не имело значения, поэтому вот моя проблема:
Я хочу проанализировать строку, которая содержит текст HTML. Я хочу сделать это в JavaScript.
Я попробовал эту библиотеку, но кажется, что она анализирует HTML моей текущей страницы, а не строки. Потому что, когда я пробую приведенный ниже код, он меняет заголовок моей страницы:
var parser = new HTMLtoDOM("<html><head><title>titleTest</title></head><body><a href='test0'>test01</a><a href='test1'>test02</a><a href='test2'>test03</a></body></html>", document);
Моя цель - извлечь ссылки с внешней HTML-страницы, которую я читаю как строку.
Знаете ли вы API для этого?
doc.getElementsByTagName('a')
для чтения ссылок (или дажеdoc.links
).Ответы:
Создайте фиктивный элемент DOM и добавьте к нему строку. Затем вы можете манипулировать им как любым элементом DOM.
Изменить: добавив JQuery ответ, чтобы порадовать поклонников!
источник
document.createElement('html');
чтобы сохранить<head>
и<body>
теги.parse()
Раствор ниже более многоразовый и элегантный.Все довольно просто:
Согласно MDN , чтобы сделать это в chrome, вам нужно проанализировать как XML:
В настоящее время он не поддерживается webkit, и вам придется следовать ответу Флориана, и в большинстве случаев он неизвестен для мобильных браузеров.Изменить: теперь широко поддерживается
источник
documentURL
ofwindow
, который, скорее всего, отличается от URL-адреса строки.new DOMParser
один раз, а затем повторно использовать этот же объект в оставшейся части вашего сценария.parse()
ниже решение более пригодно для повторного использования и относится к HTML. Это хорошо, если вам нужен документ XML, однако.РЕДАКТИРОВАТЬ: Решение ниже только для HTML «фрагментов», так как HTML, голова и тело удалены. Я думаю, что решение этого вопроса - метод parseFromString () в DOMParser.
Для фрагментов HTML решения, перечисленные здесь, работают для большей части HTML, однако в некоторых случаях это не будет работать.
Например попробуйте разбор
<td>Test</td>
. Это не будет работать ни с решением div.innerHTML, ни с DOMParser.prototype.parseFromString, ни с решением range.createContextualFragment. Тег тд пропадает и остается только текст.Только jQuery хорошо справляется с этим делом.
Поэтому будущее решение (MS Edge 13+) заключается в использовании тега шаблона:
Для старых браузеров я извлек метод jQuery parseHTML () в независимую суть - https://gist.github.com/Munawwar/6e6362dbdf77c7865a99
источник
<template>
тег . Это зависит от пользовательских элементов, которые вам также могут понадобиться для заполнения . На самом деле вы можете просто захотеть использовать webcomponents.js, чтобы заполнить пользовательские элементы, шаблоны, shadow dom, обещания и некоторые другие вещи одновременно.источник
$
? Кроме того, как упомянуто в связанном дубликате ,text/html
он не очень хорошо поддерживается и должен быть реализован с использованием полизаполнения.DOMParser
ни одна из них не работаетtext/html
в Chrome, эта страница MDN дает обходной путь.Самый быстрый способ разбора HTML в Chrome и Firefox - Range # createContextualFragment:
Я бы порекомендовал создать вспомогательную функцию, которая использует createContextualFragment, если он доступен, и в противном случае возвращается к innerHTML.
Тест: http://jsperf.com/domparser-vs-createelement-innerhtml/3
источник
innerHTML
, это будет выполнять<img>
'ы'onerror
.Следующая функция
parseHTML
вернет либо:Document
если файл начинается с DOCTYPE.DocumentFragment
если файл не запускается с DOCTYPE.Код :
Как пользоваться :
источник
trim
метод для строк. См. Stackoverflow.com/q/2308134/3210837 .Если вы открыты для использования jQuery, у него есть несколько хороших возможностей для создания отдельных элементов DOM из строк HTML. Затем их можно запросить обычными способами, например:
Редактировать - только что видел ответ @ Флориана, который является правильным. Это в основном именно то, что он сказал, но с jQuery.
источник
Только действительные дочерние
Node
элементы в родительскомNode
(началоRange
) будут проанализированы. В противном случае могут возникнуть неожиданные результаты:источник
с помощью этого простого кода вы можете сделать это:
источник