3

我正在尝试解析一个 HTML 文件并在其中获取所有 href。

到目前为止,我使用的代码是:

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

str_response 是其中包含 HTML 代码的字符串。根据我对 Clojure 的基本理解,该代码应该打印一个匹配列表,但到目前为止,还没有运气。它不会崩溃,但它也不匹配任何东西。我试过使用re-seq而不是re-find,但没有运气。有什么帮助吗?

谢谢!

4

3 回答 3

4

通常,尽管您无法使用正则表达式(有趣的答案)解析 html,但仅找到一个标签的所有出现应该是可行的。

一旦你找出正确的正则表达式re-seq就是你想要使用的函数:

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

这对您来说不会崩溃,因为 re-find 返回 nil 哪个地图被解释为空列表并且什么也不做

于 2012-06-04T22:28:59.840 回答
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])))
于 2012-06-04T22:36:30.373 回答
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))

Noteref-find也有效,尽管它只返回一个匹配项。

于 2012-06-05T02:02:41.493 回答