对于ClojureScript项目,我正在寻找一种在客户端从外部HTML文档中提取内容的简明方法。内容实际上是通过Markdown格式的ajax调用接收的,随后将其解析为HTML。因此,HTML字符串就是起点。
(def html-string "<p>Something, that <a>was</a> Markdown before</p>")例如,Enlive和Garden库使用向量来表示这里需要的CSS选择器。Enlive有一个叫做Enfocus的前端姐妹,它提供了类似的语义。
下面是一个从当前DOM中提取一些内容的enfocus示例:
(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包装了所有东西,这在某些情况下可能会带来麻烦。
发布于 2016-09-26 18:27:44
将一些超文本标记语言内容插入到div中可以自动计算任意的超文本标记语言。您应该做的是用下面这样的代码来解析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 namespace或者谷歌闭包API中的其他地方,也许使用谷歌闭包库会更优雅一些。
然后解析您的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"}https://stackoverflow.com/questions/39468967
复制相似问题