0

私はenlive-tutorialに従いましたが、Webを解析するためのEnliveの力に感銘を受けたと言わなければなりません。今、私はここで利用可能なscrap3.cljをさらに調べるようになりました:https ://github.com/swannodette/enlive-tutorial/blob/master/src/tutorial/scrape3.clj

Swannodetteはこの例の設計で素晴らしい仕事をしましたが、少し乾燥させることができたと思います。

私の質問:この抽出関数を書き直して、ドライヤーにしますか?

(defn extract [node]
  (let [headline (first (html/select [node] *headline-selector*))
        byline   (first (html/select [node] *byline-selector*))
        summary  (first (html/select [node] *summary-selector*))
        result   (map html/text [headline byline summary])]
    (zipmap [:headline :byline :summary] (map #(re-gsub #"\n" "" %) result)))) 

プログラムの他の要素について他のアイデアがある場合は、遠慮なく共有してください。

編集:私は遊んで思いついた:

    (defn extract [node]
      (let [s [*headline-selector* *byline-selector* *summary-selector*] 
            selected (map #(html/text (first (html/select [node] %))) s)
            cleaned  (map #(re-gsub #"\n" "" %) selected)]
        (zipmap [:headline :byline :summary] cleaned)))
4

2 に答える 2

2

first (html/select [node]ローカル関数に持ち上げることができます:

(defn extract [node]
  (let [selector (fn [sel]) (html/select [node] sel)
        headline (selector *headline-selector*)
        byline   (selector *byline-selector*)
        summary  (selector *summary-selector*)
        result   (map html/text [headline byline summary])]
    (zipmap [:headline :byline :summary] (map #(re-gsub #"\n" "" %) result))))

次に、中間名を削除できますが、これらはコードの要点を明確にするのに役立つため、個人的な好みの問題です。

(defn extract [node]
  (let [selector (fn [selector]) (html/select [node] selector)
        result   (map html/text 
                   (map selector [*headline-selector* 
                                  *byline-selector* 
                                  *summary-selector*]))]
    (zipmap [:headline :byline :summary] (map #(re-gsub #"\n" "" %) result)))) 
于 2013-02-25T23:32:37.223 に答える
1

関数の結果を「より見やすく」するために、以下に示すようにマップリテラルを使用します。

(defn extract [node]
  (let [sel #(html/text (first (html/select [node] %)))
        rem #(re-gsub #"\n" "" %)
        get-text #(-> % sel rem)]
    {:headline (get-text *headline-selector*)
     :byline (get-text *byline-selector*)
     :summary (get-text *summary-selector*)
     }))
于 2013-02-26T04:49:20.813 に答える