我正在尝试使用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选择器。
非常感谢。
已编辑:要包含完整代码。
答案 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部分时,您的代码应该可以工作。