2014-09-01 4 views
0

나는 영화에 대한 간단한 clojure 프로젝트에서 일하고 있습니다. 그래서 특정 웹 사이트에서 검색 결과를 구문 분석하려고합니다. 제 경우에는 imdb.com입니다. 확실하지 않은 나는이 올바른 경로에있어 그래서 누군가가 나를 도울 수 있기를 바랍니다.웹 사이트에서 검색 결과를 구문 분석, 컴파일/clojure

홈페이지는 영화 제목을 입력하고 "검색"버튼을 제출할 텍스트 입력란으로 아주 간단 해 보일 것입니다. 나는 최대한으로 deatailed 수하려고합니다 :

(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.이 내가 사용했던 기능을 다음과 같습니다 :

1.이 메인 페이지입니다

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

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

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

:

3.And이 내가보기 출력 및 뷰 출력 2 기능을 사용하고 같은 클래스에서 GET/POST 부분입니다 여기

(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.And

지도 다루는 다른 클래스에 정의 된 마지막 함수입니다 :

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

나는 그것이 알고 4.Also, 이들은 이전의 사람들이 사용하고있는 기능은 다음과 같습니다 이 방법으로 누군가가 문제가있는 곳을 볼 수 있지만, 지금까지 검색 결과 페이지에는 결과도 오류도 표시되지 않고 h2 검색 결과 제목이있는 빈 페이지 만 표시됩니다. 미리 감사드립니다!

+0

[최소 완전하고 검증 가능한 예제를 만드는 방법] (http://stackoverflow.com/help/mcve)을 참조하십시오. 현재 서면으로,이 질문은 잠재적 인 응답자로부터 너무 많은 투자가 필요합니다. –

답변

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. 렌더링 코드가 올바른 데이터로 기대 한대로 작동하는지 확인할 수 있습니다.

실제로 범주와 a가 nil 인 경우, 미들웨어 처리기 (see why this matters)을 잊어 버린 것일 수도 있습니다.

예상되는 구조에서 예상되는 데이터가 포함되어 있다면 다른 기능을 살펴볼 차례입니다. 이를 위해 REPL 세션을 사용하고 최상위 함수를 하드 코딩 된 값으로 호출하는 것이 좋습니다. 단, 재 포장을 사용하는 경우 양식을 다시 제출하면됩니다. 예를 들어 mapper-gen4 함수 및 get-page 함수의 입력 및 출력에 대한 출력물을 추가 할 수 있습니다.

마지막으로 일부 값과 결과로 재생 한 후 REPL에서 테스트 파일로 복사하여 코드 작동 방식에 대한 일부 영구적 인 주장을합니다.

다른 모든 것이 실패하면 github 프로젝트에 대한 링크를 게시하면 더 나은 도움을 얻을 수 있습니다. 또는 비공개 인 경우 사람들이보다 정확하게 당신을 도울 수 있도록 최소한의 예제 프로젝트를 만듭니다.

+0

좋아요, 범주 만 nil입니다. "a"는 의도 한대로 작동합니다. 이 언어에 익숙하지 않으므로 "하드 코딩 된"단어가 무엇을 의미합니까? 예를 들어 줄 수 있습니까? 이 함수의 결과는 영화 이름 목록과 imdb의 해당 이미지가있는 페이지 여야합니다. 미리 감사드립니다. – Wombat

+0

좋아요! 어떤 범주도 통과하지 못했음을 알았 으면 어떤 결과도 얻지 못합니다. 내가 "하드 코딩 된"이라고 말하면 함수에 대한 입력에 대한 기대치를 기반으로 한 테스트 데이터를 말합니다. 예를 들어 (inc) 함수를 테스트하려는 경우 1의 값을 전달합니다. 카테고리 인수 데이터는 다음과 같습니다. –

+0

* hard-coded-categories * 및 * hard-coded-a *의 다른 값을 사용하여 시도 할 때 카테고리 변수는 장르 체크 박스 전용이므로 범주가 nil 인 경우에도 검색 결과 페이지에 soemthing이 표시되어야합니다. 더 이상의 문제를 피하기 위해 코드 부분을 지울 계획입니다. 문제는 이제 h3 + table2 func을 사용하는 get-image-content func에서 발생합니다. imdb 사이트의 해당 부분을 구문 분석하기 위해 올바른 html/attr을 사용하고 있는지 확실하지 않습니다. 어느 쪽이든, 나는 티모시에게 당신의 도움에 정말 감사드립니다! – Wombat