2014-06-11 6 views
1

트위터 데이터의 URL을 확장하고 (동시에 -ish) 도메인을 추출하려고합니다. 전에 요청을 사용하여 파이썬에서이 작업을 시도했지만 URL의 대부분이 여전히 '짧은'양식 (bit.ly, goo.gl 등)으로 남아 있기 때문에 어딘가에 망쳐 놓은 것 같아요. Twitter가 있습니다. JSON으로 저장된 데이터. URL을 확인하기 위해 clj-http.client :as client을 사용하고 있습니다. 지금까지, 다음과 같습니다 코드를 가지고 :지연 시퀀스 평가 타이밍 문제

내가 [tweet-id [{tweet-data-map} {user-data-map}]] 형식의 트위터 데이터를 가지고
(defn expand-urls [urls] (for [url-str urls] 
        (and url-str (last (:trace-redirects 
              (client/get url-str)))))) 

(def ^:dynamic *domain-pat* (re-pattern #"https?://([\w\.]+)/.*")) 

(defn get-domains [urls] (for [url urls] (first (filter #(not= url %1) 
          (re-find *domain-pat* url))))) 

, 그래서 (get-in json-data [1 0 "urls"]는 도메인을 반환 (get-in json-data [1 0 "domains"]), URL을 반환합니다.

(update-in (update-in js-line [1 0 "urls"] expand-urls) [1 0 "domains"] get-domains)과 같은 것을 시도하면 domains(nil)입니다. 나는 독립적으로 정규식이 작동하는지 확인 했으므로, 에 의해 반환 된 게으른 시퀀스는 get-domains이 호출 될 때 평가되지 않는다고 생각됩니다. 실망스럽게도 (type (doall (expand-urls some-urls)))clojure.lang.LazySeq과 마찬가지로 (type (doall (doall (expand-urls some-urls))))을 반환합니다. 나는 doall을 시도했는데, expand-urlsvec을 추가하려고 시도했습니다. 어느 쪽도 효과가없는 것 같습니다.

이것은 실제로 게으른 문제입니까, 아니면 다른 것이 있습니까?

+0

업데이트 결과를 바인딩합니까? update-in은 인수를 변경하지 않고 수정 된 복사본을 반환합니다. 또한 정규 표현식 대신'(.getHost (java.net.URL. 주소))'를 사용하는 것을 고려하십시오. – noisesmith

+0

게으름을 처리하는 방법은 게으른 함수의 결과를 사용하는 것입니다. 실현 된 (즉, doall을 통한) 것이 든 아니든, 유형에 게으른 seq으로 남을 것입니다. – noisesmith

+0

noisesmith의 의견에 따라 달라집니다 :'실현 됐나요? '를 사용하여 게으른 seq가 구현되었는지 테스트 할 수 있습니다. – Mars

답변

-1

해결했습니다! 열쇠는 추가 된 doallexpand-urls로 :

(defn expand-urls [urls] (vec (doall (for [url-str urls] 
         (and url-str (last (:trace-redirects 
              (client/get url-str)))))))) 

합니다 (vec 실제로 필요하지 않습니다,하지만 난 다시 직렬화이 물건에 계획입니다 및 org.clojure/data.json이 목록을 변환하는 방법에 대해 걱정하고 싶지 않았다.)

모두에게 감사드립니다. 나는 당신이 당신의 결과에 NILS을 원하지 않는 가정

+0

vec는 doall을 중복 이는 벡터가 열의있는 데이터 유형이기 때문입니다. 또한 시리얼 라이저는 열망 할 것이고 (게으른 seq에 대해 vec와 동일한 결과를 출력 할 것이다), vec 나 doall은 실제로 여기에 필요하지 않다. – noisesmith

+0

이것은 해결책이 아니므로이 코드와 관련이없는 문제를 해결했습니다. – noisesmith

0

당신은 당신의 솔루션을 다시 작성할 수 있습니다

(defn expand-urls [urls] (
    (mapv #(last (:trace-redirects (client/get %)) 
    (remove nil? urls))) 

에 여기에 역동적 인 Clojure의 지원 커뮤니티 : 거기 기뻐요. Mapv는 게으른지도의 엄격한 대응이며 항상 벡터를 반환합니다.