Clojure 在enlive中对模板执行多次传递的最佳方法是什么
我想获取一个抓取的html页面,并从中创建一个enlive模板Clojure 在enlive中对模板执行多次传递的最佳方法是什么,clojure,enlive,Clojure,Enlive,我想获取一个抓取的html页面,并从中创建一个enlive模板 (-> (fetch) ; function returns clj-http.client/get (:body) (clojure.java.io/reader) (html/html-resource) ; enlive (swap-header) (swap-body-tag)) 我的两个交换FN看起来像这样 (defn swap-header [body] (as->
(-> (fetch) ; function returns clj-http.client/get
(:body)
(clojure.java.io/reader)
(html/html-resource) ; enlive
(swap-header)
(swap-body-tag))
我的两个交换FN看起来像这样
(defn swap-header [body]
(as-> (html/deftemplate temp body [content] [:body] (html/content content)) x
(apply str (x "testing"))))
(defn swap-body-tag [body]
(as-> (html/deftemplate temp body [disabled] [:body] (html/set-attr :disabled disabled)) x
(apply str (x "yo-123"))))
因此,两难的是,我可以从fetch-return管道中注释掉这两种交换中的任何一种,并且效果很好。尝试按任一顺序进行都会失败。我相信应用模板的结果是错误的格式,使另一个模板从它,但不能完全得到我需要的地方
链接它们时出现的错误是找不到HTML资源
编辑以使用更多填写的代码并删除补偿
更新
我从中复制了一个函数以使字符串成为读取器。这似乎使它起作用了。从性能角度来看,这似乎是一个好方法吗
(->> ctx
(:request)
(fetch)
(:body)
(clojure.java.io/reader)
(html/html-resource)
(swap-body-tag)
(apply str) ; new
(string->stream) ; new
(swap-header))
在调用comp时,您是否将函数反转?它们首先从右侧应用。也许:
((comp swap-urls clean-footer clean-header) parsed)
这是这样的:
(-> parsed
clean-header
clean-footer
swap-urls)
与comp相比,我更喜欢thread-first宏,因为我认为它更清晰。通过->和->>执行同样的操作也很常见;例如->解析干净的页眉干净的页脚交换URL等你能发布一些示例数据吗?这会让你更容易看到你在做什么以及哪里出了问题。好吧,这并不是因为我把清洁过的东西弄乱了,它们取决于非常不同的部分。也许让我再填一点我的问题。