Saya mencari solusi tetapi tidak ada yang relevan, jadi inilah masalah saya:
Saya ingin mengurai string yang berisi teks HTML. Saya ingin melakukannya dalam JavaScript.
Saya mencoba perpustakaan ini tetapi tampaknya mem-parsing HTML halaman saya saat ini, bukan dari string. Karena ketika saya mencoba kode di bawah ini, ia mengubah judul halaman saya:
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);
Tujuan saya adalah untuk mengekstrak tautan dari halaman eksternal HTML yang saya baca seperti string.
Apakah Anda tahu API untuk melakukannya?
javascript
html
dom
html-parsing
tahap
sumber
sumber
doc.getElementsByTagName('a')
untuk membaca tautan (atau bahkandoc.links
).Jawaban:
Buat elemen DOM dummy dan tambahkan string ke dalamnya. Kemudian, Anda dapat memanipulasi seperti elemen DOM.
Sunting: menambahkan jawaban jQuery untuk menyenangkan para penggemar!
sumber
document.createElement('html');
untuk menyimpan<head>
dan memberi<body>
tag.parse()
solusi di bawah ini lebih dapat digunakan kembali dan elegan.Sederhana saja:
Menurut MDN , untuk melakukan ini di chrome Anda perlu mengurai XML seperti:
Saat ini tidak didukung oleh webkit dan Anda harus mengikuti jawaban Florian, dan itu tidak diketahui untuk bekerja dalam kebanyakan kasus di browser seluler.Sunting: Sekarang didukung secara luas
sumber
documentURL
dariwindow
, yang kemungkinan besar berbeda dari URL string.new DOMParser
sekali dan kemudian menggunakan kembali objek yang sama sepanjang sisa skrip Anda.parse()
solusi di bawah ini lebih dapat digunakan kembali dan spesifik untuk HTML. Ini bagus jika Anda memerlukan dokumen XML.EDIT: Solusi di bawah ini hanya untuk "fragmen" HTML karena html, head, dan body dihapus. Saya kira solusi untuk pertanyaan ini adalah metode parseFromString () DOMParser.
Untuk fragmen HTML, solusi yang tercantum di sini berfungsi untuk sebagian besar HTML, namun untuk kasus tertentu itu tidak akan berfungsi.
Misalnya coba parsing
<td>Test</td>
. Yang ini tidak akan bekerja pada solusi div.innerHTML atau DOMParser.prototype.parseFromString atau range.createContextualFragment solution. Tag td hilang dan hanya teks yang tersisa.Hanya jQuery yang menangani case itu dengan baik.
Jadi solusi masa depan (MS Edge 13+) adalah dengan menggunakan tag template:
Untuk peramban yang lebih lama, saya telah mengekstraksi parseHTML () metode jQuery menjadi intisari independen - https://gist.github.com/Munawwar/6e6362dbdf77c7865a99
sumber
<template>
tag . Hal ini tergantung pada unsur-unsur kustom yang Anda juga mungkin perlu polyfill . Bahkan Anda mungkin hanya ingin menggunakan webcomponents.js untuk polyfill elemen kustom, template, dom bayangan, janji, dan beberapa hal lainnya sekaligus.sumber
$
? Juga, sebagaimana disebutkan dalam duplikat tertaut ,text/html
tidak didukung dengan sangat baik, dan harus diimplementasikan menggunakan polyfill.DOMParser
tidak bekerjatext/html
di chrome, halaman MDN ini memberikan solusi.Cara tercepat untuk mem-parsing HTML di Chrome dan Firefox adalah Range # createContextualFragment:
Saya akan merekomendasikan untuk membuat fungsi pembantu yang menggunakan createContextualFragment jika tersedia dan kembali ke innerHTML sebaliknya.
Benchmark: http://jsperf.com/domparser-vs-createelement-innerhtml/3
sumber
innerHTML
, ini akan mengeksekusi<img>
'sonerror
.Fungsi berikut
parseHTML
akan mengembalikan:a
Document
ketika file Anda dimulai dengan sebuah DOCTYPE.a
DocumentFragment
ketika file Anda tidak dimulai dengan sebuah DOCTYPE.Kode :
Cara Penggunaan :
sumber
trim
metode string. Lihat stackoverflow.com/q/2308134/3210837 .Jika Anda terbuka untuk menggunakan jQuery, ia memiliki beberapa fasilitas bagus untuk membuat elemen DOM terpisah dari string HTML. Ini kemudian dapat ditanyakan melalui cara biasa, misalnya:
Sunting - hanya melihat jawaban @ Florian yang benar. Ini pada dasarnya persis apa yang dia katakan, tetapi dengan jQuery.
sumber
Hanya anak-anak yang valid
Node
dalam orangtuaNode
(mulai dariRange
) yang akan diuraikan. Jika tidak, hasil yang tidak terduga dapat terjadi:sumber
dengan kode sederhana ini Anda dapat melakukannya:
sumber