Clojure 在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->

我想获取一个抓取的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-> (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等你能发布一些示例数据吗?这会让你更容易看到你在做什么以及哪里出了问题。好吧,这并不是因为我把清洁过的东西弄乱了,它们取决于非常不同的部分。也许让我再填一点我的问题。