【问题标题】:Parsing search results from website, compojure/clojure从网站、compojure/clojure 解析搜索结果
【发布时间】:2014-10-25 20:24:05
【问题描述】:

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

主页看起来很简单,带有文本字段,您可以在其中输入电影名称和名为“搜索”的提交按钮。我会尽量详细一点:

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.这是最后一个,在另一个处理地图的类中定义的函数:

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

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

【问题讨论】:

标签: parsing search map clojure imdb


【解决方案1】:

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

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

插入一个不起眼的打印语句:

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

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

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

hard-coded-categorieshard-coded-a 替换为您期望看到的数据结构。这将测试:

  1. 您将在请求中看到参数所在的位置。
  2. 您将看到您的渲染代码使用正确的数据是否符合您的预期。

如果问题确实是 category 和 a 为 nil,那可能只是因为您忘记了中间件处理程序 (see why this matters)

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

最后,在使用了一些值和结果之后,将它们从你的 REPL 复制到一个测试文件中,这样你就可以对你的代码的行为方式有一些永久的断言。

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

【讨论】:

  • 好的,只有类别为零,“a”按预期工作。只是想问一下,由于我是这种语言的新手,“硬编码”是什么意思?你能给我一个例子吗?由于这些函数的结果应该是一个页面,其中包含电影名称列表及其来自 imdb 的相应图像。提前致谢
  • 太棒了!看到你没有传递任何类别,你没有得到任何输出。当我说“硬编码”时,我的意思是根据您对函数输入的期望来测试数据,例如,如果我想测试 (inc) 函数,我会将其传递一个值 1。在您的情况下,您期望什么类别参数数据看起来像。
  • 在进一步尝试使用不同的 hard-coded-categorieshard-coded-a 值时,搜索结果页面应该显示一些东西,甚至尽管类别为零,因为类别变量仅用于流派复选框。我打算删除那部分代码以避免任何进一步的问题。现在的问题是 get-image-content func,它使用 h3+table2 func,我不确定我是否使用正确的 html/attr 来解析 imdb 站点的那部分。无论哪种方式,我都非常感谢蒂莫西的帮助!
  • 我已经在 GitHub 上上传了项目,希望我上传了所有内容,因为我是第一次使用它:movie-search-compojure 就像我之前所说的,问题必须在 view-output2 部分的某个地方。如果有人能提供帮助,我真的很感激。提前致谢
  • 您当前对图像+搜索的定义在传递“rottentomatoes.com/search/?search=ghost”时不返回任何结果您的实时选择器似乎不正确。相反,也许你想要这样的东西: (map #(get-in % [:attrs :src]) (html/select (get-page url) [:span.movi​​eposter :img])) 如果你使用相同的 url 给出结果是一系列图像网址。如果有什么特定的东西阻碍了你,请询问 - 一般来说,我建议测试你的功能。
猜你喜欢
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 2013-02-09
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多