我正在尝试解析HTML文件并获取其中的所有href。
到目前为止,我正在使用的代码是:
(map
#(println (str "Match: " %))
(re-find #"(?sm)href=\"([a-zA-Z.:/]+)\"" str_response))
str_response是其中包含HTML代码的字符串。根据我对Clojure的基本理解,该代码应该打印一份匹配列表,但到目前为止,没有运气。
它不会崩溃,但它也不匹配任何东西。
我尝试使用re-seq
代替re-find
,但没有运气。有什么帮助吗?
谢谢!
答案 0 :(得分:4)
通常虽然you cannot parse html with a regex(有趣的答案),但只是找到一个标签的所有出现应该是可行的。
一旦你弄清楚正确的正则表达式re-seq
是你想要使用的函数:
user> (re-find #"aa" "aalkjkljaa")
"aa"
user> (re-seq #"aa" "aalkjkljaa")
("aa" "aa")
这对你来说没有崩溃,因为重新查找返回nil,哪个地图正在解释为空列表并且什么都不做
答案 1 :(得分: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])))
答案 2 :(得分: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
也可以,但它只返回一个匹配。