如何在Clojure中迭代和修改Jsoup元素的集合

时间:2019-04-15 23:10:05

标签: clojure jsoup

我想解析HTML文件/字符串并修改某些元素,然后使用Clojure返回修改后的HTML。

我有三个主要目标:

  1. 接受当前的href并在其前面加上另一个URL
  2. 替换图像标签的src路径以指向新位置
  3. 在文档的最后添加一个元素

我可以获取Document,并使用Jsoup选择器来获取元素。问题在于,当我遍历集合并进行更改时,原始文档不会反映出更改。

  (ns email.test
  (:import [org.jsoup Jsoup]
           [org.jsoup.nodes Document]
           [org.jsoup.select Elements]))

(def html-string "
<html>
  <body>
    <div>
        <a href='http://test.com'>Test 1</a>
        <a href='http://test.com'>Test 2</a>
        <a href='http://test.com'>Test 3</a>
        <img alt='first' src='http://test.com/img/one.jpg'/>
        <img alt='second' src='http://test.com/img/two.jpg'/>
    </div>
  </body>
</html>")


(defn get-html-doc
  "Take HTML string and return Jsoup Document"
  [html]
  (Jsoup/parseBodyFragment html)
  )

(defn prefix-html-links
  "Parse HTML Document and replace links prefixing the current link with another"
  [selector prefix html]
  (let [links (.select html selector)]
    (for [l links]
      (let [orig (.attr l "href")]
        (.attr l "href" (str prefix orig))
        )
      ))
  html
  )

(prefix-html-links  "a[href]" "http://example.com?s=" (get-html-doc html-string))

编辑:您需要使用doseq而不是for才能运行,

0 个答案:

没有答案