我正在尝试递归浏览页面中的所有可用链接,如果它验证了工作链接,请从该页面拉出所有链接并将其添加到列表中,以便在当前页面完成后进行爬网。但是我认为我在链接序列中使用Conj遇到了问题。
当我运行我的代码时,它似乎只是在我第一次调用该函数时执行的初始链接列表。
(defn process-links
[links]
(if (not (empty? links))
(do
(if (not (is-working (first links)))
(println (str (first links) " is not working"))
(conj (get-links (first links)) links))
(recur (rest links)))))
我不太清楚为什么它没有在列表中添加其他项目。任何人都可以建议为什么这样做?
答案 0 :(得分:3)
Clojure的数据结构是不可改变的。您没有对从以下位置返回的数据结构做任何事情:
(conj (get-links (first links)) links)
其他一些事情:
get-link
返回的内容中;这可能不是你想要做的。答案 1 :(得分:2)
这看起来像是一个使用tree-seq的有趣机会:在网址上创建一个树,其中每个网址的“子”都是通过诋毁其文字并查找更多链接来确定的。然后除了Alex提到的循环问题之外,你可以像任何其他序列一样遍历链接序列。