2012-06-04 80 views
3

我試圖解析一個HTML文件並獲取其中的所有href。在clojure上獲取正則表達式的所有匹配

到目前爲止,我正在使用的代碼是:

(map 
    #(println (str "Match: " %)) 
    (re-find #"(?sm)href=\"([a-zA-Z.:/]+)\"" str_response)) 

str_response是與它裏面的HTML代碼的字符串。根據我對Clojure的基本理解,該代碼應該打印一個匹配列表,但到目前爲止,沒有運氣。 它不會崩潰,但它也不匹配任何東西。 我試過使用re-seq而不是re-find,但沒有運氣。任何幫助?

謝謝!

+1

如果你在你的問題中包含str_response的值,我可以幫助正則表達式, –

回答

3

這真的看起來像一個HTML抓取問題,在這種情況下,我會建議使用enlive

像這樣的東西應該工作

(ns test.foo 
    (:require [net.cgrand.enlive-html :as html])) 

(let [url (html/html-resource 
      (java.net.URL. "http://www.nytimes.com"))] 
    (map #(-> % :attrs :href) (html/select url [:a]))) 
+0

感謝您的答案!它似乎是最「優雅」的一個。 – Deleteman

4

它通常雖然you cannot parse html with a regex(有趣的答案),但只是發現一個標籤的所有發生應該dooable。

一旦你找出正確的正則表達式re-seq是你想使用的功能:

user> (re-find #"aa" "aalkjkljaa") 
"aa" 
user> (re-seq #"aa" "aalkjkljaa") 
("aa" "aa") 

這不是崩潰了你,因爲重新找到被返回nil該地圖被解釋爲空列表和做什麼都沒有

+0

呃......如果你想做正確的話,那麼這樣做不太可行。想要排除引用爲CDATA的非XML文本?想要排除屬於不同命名空間的標籤?等 –

+0

你是完全正確的:我強烈建議在這個話題上的鏈接的答案:)「中心不能容納...」 –

2

我不認爲這有什麼不對您的代碼。也許str_response是犯罪嫌疑人。以下作品與http://google.com與您正則表達式:

(let [str_response (slurp "http://google.com")] 
    (map #(println (str "Match: " %)) 
    (re-seq #"(?sm)href=\"([a-zA-Z.:/]+)\"" str_response)) 

ref-find也適用,雖然它只返回一個匹配。

+0

感謝您的回答,出於某種原因,我的項目中的代碼沒有打印任何內容,我決定採用Julien的解決方案。感謝您抽出寶貴的時間! – Deleteman

+0

不客氣。就解析html而言,克里斯格蘭特的活力是要走的路。 – jbear

相關問題