从网站,compojure / clojure解析搜索结果

时间:2014-09-01 15:05:17

标签: parsing search map clojure imdb

有一段时间我正在为电影制作一个简单的clojure项目,所以我试图解析来自特定网站的搜索结果,在我的案例中是imdb.com。不确定如果我在正确的轨道上这样做,所以我希望有人能帮助我。

主页看起来很简单,带有文本字段,您可以在其中输入电影名称并提交名为" Search"的按钮。我会尝试尽可能地减少数据:

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.这是同一类中的GET / POST部分,我使用view-output和view-output2函数:

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

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

4.此外,这些是以前使用的功能:

(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")]))  

5.这里是最后一个,在另一个处理map的类中定义的函数:

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

我知道它有点多,但这样一来,有人会看到问题出在哪里,到目前为止搜索结果页面显示没有结果,也没有错误,只显示带有h2搜索结果标题的空白页面。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我将从表单处理路径开始:

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

插入一份不起眼的印刷声明:

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

确保您的处理程序包含wrap-reload,以便您可以刷新页面并检查控制台。您可能会看到类别和a是零,在这种情况下,您可能会接下来尝试这样的事情:

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

硬编码类别硬编码 - 替换为您希望看到的数据结构。这将测试:

  1. 您将在请求中看到参数的位置。
  2. 您将看到您的渲染代码是否符合您所期望的正确数据。
  3. 如果确实问题是类别和a是零,那可能就是你忘记了中间件处理程序(see why this matters)

    如果它们包含您期望的结构中所期望的数据,那么现在是时候深入了解其他功能。为此,我建议使用REPL会话并使用您希望从表单中获得的硬编码值调用顶级函数,但是如果您使用wrap-reload,则还可以重新提交表单。例如,您可以添加mapper-gen4函数和get-page函数的输入和输出的打印输出。

    最后,在播放了一些值和结果后,将这些值从REPL复制到测试文件中,以便对代码的行为方式有一些永久的断言。

    如果所有其他方法都失败了,发布指向github项目的链接将为您提供更好的帮助 - 或者如果它是私有的,请创建一个最小的示例项目,以便人们可以更精确地帮助您。