簡體   English   中英

從ClojureScript中的html字符串中提取元素

[英]Extract elements from html-string in ClojureScript

對於ClojureScript項目,我正在尋找一種簡潔的方法來從客戶端的外部HTML文檔中提取內容。 實際上,該內容是通過Markdown格式的ajax調用接收的,隨后將其解析為HTML 因此, HTML字符串是出發點。

(def html-string "<p>Something, that <a>was</a> Markdown before</p>")

例如, EnliveGarden庫使用向量來表達CSS選擇器,這在這里是必需的。 Enlive有一個稱為Enfocus的前端姐妹,它提供類似的語義。

這是一個enfocus示例,該示例從當前DOM中提取一些內容:

(require '[enfocus.core :as ef])

(ef/from js/document.head :something [:title]
         (ef/get-text))
;;{:something "My Title"}

如果有更多匹配,則:something的值將成為向量。 我不知道如何在任意HTML字符串上應用此功能。 我能得到的最接近的是使用此函數:

(defn html->node [h]
  (doto (.createElement js/document "div")
    (aset "innerHTML" h)))

接着:

(ef/from (html->node html-string) :my-link [:a]
  (ef/get-text))
;;{:my-link "was"}

但是,這並不是很干凈,因為現在有一個div包裝了所有內容,這在某些情況下可能會引起麻煩。

div插入一些HTML內容可以自動評估您的任意HTML。 相反,您應該執行的操作是使用此類內容解析HTML字符串。

(defn parse-html [html]
  "Parse an html string into a document"
  (let [doc (.createHTMLDocument js/document.implementation "mydoc")]
    (set! (.-innerHTML doc.documentElement) html)
    doc
    ))

這是簡單明了的ClojureScript,如果您希望深入goog.dom命名空間或Google Closure API中的其他位置,使用Google Closure庫可能會更優雅。

然后,您解析HTML字符串:

(def html-doc (parse-html "<body><div><p>some of my stuff</p></div></body>"))

因此,您可以在文檔上調用Enfocus:

(ef/from html-doc :mystuff [:p] (ef/get-text))

結果:

{:mystuff "some of my stuff"}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM