有一段时间我正在为电影制作一个简单的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搜索结果标题的空白页面。提前谢谢!
答案 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*)))
将硬编码类别和硬编码 - 替换为您希望看到的数据结构。这将测试:
如果确实问题是类别和a是零,那可能就是你忘记了中间件处理程序(see why this matters)。
如果它们包含您期望的结构中所期望的数据,那么现在是时候深入了解其他功能。为此,我建议使用REPL会话并使用您希望从表单中获得的硬编码值调用顶级函数,但是如果您使用wrap-reload,则还可以重新提交表单。例如,您可以添加mapper-gen4函数和get-page函数的输入和输出的打印输出。
最后,在播放了一些值和结果后,将这些值从REPL复制到测试文件中,以便对代码的行为方式有一些永久的断言。
如果所有其他方法都失败了,发布指向github项目的链接将为您提供更好的帮助 - 或者如果它是私有的,请创建一个最小的示例项目,以便人们可以更精确地帮助您。