首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从ClojureScript中的html-string中提取元素

从ClojureScript中的html-string中提取元素
EN

Stack Overflow用户
提问于 2016-09-13 19:31:49
回答 1查看 329关注 0票数 0

对于ClojureScript项目,我正在寻找一种在客户端从外部HTML文档中提取内容的简明方法。内容实际上是通过Markdown格式的ajax调用接收的,随后将其解析为HTML。因此,HTML字符串就是起点。

代码语言:javascript
复制
(def html-string "<p>Something, that <a>was</a> Markdown before</p>")

例如,EnliveGarden库使用向量来表示这里需要的CSS选择器。Enlive有一个叫做Enfocus的前端姐妹,它提供了类似的语义。

下面是一个从当前DOM中提取一些内容的enfocus示例:

代码语言:javascript
复制
(require '[enfocus.core :as ef])

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

如果有更多的匹配项,:something的值将变成一个向量。我不知道如何在任意的HTML字符串上应用这个函数。我能得到的最接近的结果是使用这个函数:

代码语言:javascript
复制
(defn html->node [h]
  (doto (.createElement js/document "div")
    (aset "innerHTML" h)))

然后:

代码语言:javascript
复制
(ef/from (html->node html-string) :my-link [:a]
  (ef/get-text))
;;{:my-link "was"}

然而,这并不是很干净,因为现在有一个div包装了所有东西,这在某些情况下可能会带来麻烦。

EN

回答 1

Stack Overflow用户

发布于 2016-09-26 18:27:44

将一些超文本标记语言内容插入到div中可以自动计算任意的超文本标记语言。您应该做的是用下面这样的代码来解析HTML字符串。

代码语言:javascript
复制
(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字符串:

代码语言:javascript
复制
(def html-doc (parse-html "<body><div><p>some of my stuff</p></div></body>"))

所以你可以在你的文档上调用Enfocus:

代码语言:javascript
复制
(ef/from html-doc :mystuff [:p] (ef/get-text))

结果:

代码语言:javascript
复制
{:mystuff "some of my stuff"}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39468967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档