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を解析することはできませんが(面白い答えです)、1つのタグのすべての出現を見つけるだけで十分です。

適切な正規表現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も機能しますが、一致は 1 つしか返されません。

于 2012-06-05T02:02:41.493 に答える