2014-09-01 59 views
0

一段時間以來,我一直在爲一個簡單的clojure電影項目工作,所以我試圖解析來自特定網站的搜索結果,在我的情況下是imdb.com。不知道如果我在這條正確的道路上,所以我希望有人能幫助我。從網站解析搜索結果,compojure/clojure

首頁看起來很簡單,用文本字段輸入電影名稱並提交名爲「搜索」的按鈕。我會嘗試將盡可能多的deatailed地:

1.本是主要的頁面:

(defn view-input [] 
(view-layout 
[:h2 "Find your Movie"] 
[:body {:style "font: 14pt/16pt helvetica; background-color: #F2FB78; padding-top:100px; text-align: center" } 
(form-to [:post "/"] 
    [:br] 
    [:br] 
    (text-field {:placeholder "Enter movie name" } :a) [:br] 
    (submit-button "Search") 
    )] 
    )) 

2.這些是我一直在使用的功能:

(defn create-flick-url [a] 
(str "http://www.imdb.com/search/title?title=" a "&title_type=feature"   
    )) 


(defn flick-vec [categories a] 
     (vec (let [flick-url (create-flick-url a) 
       flick-names (print-flick-name-content flick-url)] 
       (mapper-gen4 flick-names 
       (get-image-content flick-url) 
       )))) 

(defn view-output2 [categories a]  
(view-layout 
[:h2 "Search results"] 
[:form {:method "post" :action "/"}    
    (interleave 
    (for [flick (flick-vec categories a)]   
    (label :title (:name flick))) 
    (for [flick-name (flick-vec categories a)]   
    [:br])   
    (for [flick-image (flick-vec categories a)] 
     [:img {:src (:image flick-image)}]) 
    (for [flick (flick-vec categories a)] 
     [:br])) 
     ])) 

3.And這是在同一個類,其中我使用的視圖輸出和視圖OUTPUT2函數的GET/POST部分:

(defroutes main-routes    
     (GET "/" [] 
     (view-input)) 

    (POST "/" [categories a] 
    (view-output2 categories a)) 

4.Also,這些都是以前的使用功能:

(defn print-flick-name-content 
[url] 
(vec (flatten (map :content (h3+table url))))) 

    (defn get-image-content 
    [url] 
    (vec (flatten (map #(re-find #"http.*jpg" %) 
    (map :style (map :attrs (h3+table2 url))))))) 

(defn get-page 
    "Gets the html page from passed url" 
    [url] 
    (html/html-resource (java.net.URL. url))) 

    (defn h3+table 
    "Return seq of <h3> and table tags, where content of the <h3> tag meet defined condition" 
    [url] 
    (html/select (get-page url) 
     [:td (html/attr= :class "title") :h3 :a]))  

    (defn h3+table2 
    "Return seq of <h3> and table tags, where content of the <h3> tag meet defined condition" 
    [url] 
    (html/select (get-page url) 
     [:td (html/attr= :class "image")])) 

這裏即指否極泰來的最後一個,功能另一類地圖交易中定義:

(defn mapper-gen4 
    [names images] (sort-by :name (map #(hash-map 
          :name %1 :image %2) names images))) 

我知道這是一個但這樣,有人會看到問題出在哪裏,到目前爲止,搜索結果頁面顯示沒有結果,也沒有錯誤,只有帶有h2搜索結果標題的空白頁面。提前致謝!

+0

請參閱[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。按照目前的寫法,這個問題需要潛在的回答者太多的投資。 – 2014-09-01 15:30:22

回答

0

我將開始在表單處理路線:

(POST "/" [categories a] 
    (view-output2 categories a)) 

插入一個不起眼的打印語句:

(POST "/" [categories a] 
    (do 
     (println "CAT" categories "A" a) 
     (view-output2 categories a))) 

確保您的處理器包括wrap-reload這樣你就可以刷新頁面,檢查控制檯。你可能會看到,類別和是零,在這種情況下,你可能會下一個嘗試是這樣的:

(POST "/" req 
    (do 
     (println "REQ" req) 
     (view-output2 *hard-coded-categories* *hard-coded-a*))) 

更換硬編碼類別硬編碼,一個與數據結構,你是期待看到。這將測試:

  1. 您將在請求中看到參數在哪裏。
  2. 您將看到您的渲染代碼是否符合您期望的正確數據。

如果確實問題是,類別和是零,這可能只是你忘了中間件處理(see why this matters)

如果它們包含您期望的結構中的數據,那麼現在是深入研究其他功能的時候了。爲此,我建議使用REPL會話並使用您希望從表單獲得的硬編碼值調用頂層函數,但是如果您正在使用wrap-reload,則也可以重新提交表單。例如,您可以添加mapper-gen4函數和get-page函數的輸入和輸出的打印輸出。

一些值和結果打完最後,從你的REPL這些複製到測試文件,以便您對您的代碼如何運行,一些永久性的斷言。

如果一切都失敗了,張貼一個鏈接到你的GitHub項目將讓你更好的幫助 - 或者如果它是私人的,創建一個最小的例子項目,這樣的人可以幫助你更加精確。

+0

好吧,只有類別是零,「a」按預期工作。只是想問一下,因爲我是這個語言的新手,你是什麼意思的「硬編碼」?你可以給我一個例子嗎?由於這些函數的結果應該是一個包含電影名稱列表以及來自imdb的相應圖像的頁面。在此先感謝 – Wombat 2014-09-07 15:06:38

+0

太棒了!看到你沒有通過任何類別,你沒有得到任何輸出。當我說「硬編碼」時,我的意思是根據您對函數輸入的期望測試數據,例如,如果我想測試(inc)函數,我會將其傳遞給值爲1.在您的情況下,您期望的類別參數數據看起來像。 – 2014-09-07 18:56:12

+0

進一步嘗試使用* hard-coded-categories *和* hard-coded-a *的不同值時,即使類別爲零,搜索結果頁面也應該顯示出來,因爲類別變量僅用於類型複選框。我正計劃清除那部分代碼以避免任何進一步的問題。現在的問題是get-image-content func,它使用h3 + table2 func,我不確定我是否使用正確的html/attr來解析imdb站點的那部分。無論哪種方式,我真的很感謝你的幫助蒂莫西! – Wombat 2014-09-08 10:18:07