如何编写以下clojure enlive选择器?

时间:2016-01-08 23:15:06

标签: clojure enlive

我正在尝试使用clojure的enlive库来抓取一个网站。相应的CSS选择器是:

body > table:nth-child(2) > tbody > tr > td:nth-child(3) > table > tbody > tr > td > table > tbody > tr:nth-child(n+3)

我使用jquery测试了上面的选择器,它可以工作。但我不知道如何将上述内容翻译成活跃的选择器语法。我试图写下以下内容:

(ns vimindex.core
  (:gen-class)
  (:require [net.cgrand.enlive-html :as html]))

(def ^:dynamic *vim-org-url* "http://www.vim.org/scripts/script_search_results.php?order_by=creation_date&direction=descending")
(defn fetch-url [url]
  (html/html-resource (java.net.URL. url)))

(defn scrape-vimorg []
  (println "Scraping vimorg")
  (println
    (html/select (fetch-url *vim-org-url*)
                 [:body :> [:table (html/nth-child 2)] :> :tbody :> :tr :> [:td (html/nth-child 3)] :> :table :> :tbody :> :tr :> :td :> :table :> :tbody :> [:tr (html/nth-child 1 3)]])))
;                  body  >   table:nth-child(2)         >  tbody  >  tr  >   td:nth-child(3)         >  table  >  tbody  >  tr  >  td  >  table  >  tbody  >   tr:nth-child(n + 3)
; Above selector works with jquery

(defn -main
  [& args]
  (scrape-vimorg))

但我得到了一个空洞的回应。你能告诉我如何用enlive的语法翻译上面的CSS选择器。

非常感谢。

已编辑:要包含完整代码。

2 个答案:

答案 0 :(得分:0)

您缺少的语法是围绕使用伪选择器的元素的附加括号。所以你想要这样的东西:

 [:body :> [:table (html/nth-child 2)] :> :tbody :> :tr 
 [:td (html/nth-child 3)] :> :table :> :tbody :> :tr :> :td :> 
 :table :tbody :> [:tr (html/nth-child 1 3)]])

答案 1 :(得分:0)

看起来浏览器(至少我的firefox版本)在其DOM表示中添加了一个tbody标记,即使它不在实际的源代码中。

Enlive没有这样做。因此,当您省略tbody部分时,您的代码应该可以工作。