如何使用Enlive从指定标记中抓取数据?

时间:2011-10-19 00:21:07

标签: clojure screen-scraping enlive

有人可以解释我如何从<td>标记中抓取内容<th>具有内容值(实际上在这种情况下,我需要<b>标记的内容以进行匹配操作)“Row1标题“,但是没有抓取<th>标签(或其任何内容)正在处理中?这是我的测试HTML:

<table class="table_class"> 
                    <tbody> 
                       <tr> 
                         <th>
                           <b>
                              Row1 title
                           </b>
                         </th> 
                         <td>2.660.784</td> 
                         <td>2.944.552</td> 
                         <td>Correct, has 3 td elements</td> 
                       </tr> 
                       <tr> 
                         <th>                                
                              Row2 title                                
                          </th> 
                         <td>2.660.784</td> 
                         <td>2.944.552</td> 
                         <td>Correct, has 3 td elements</td> 
                       </tr> 
                    </tbody>
</table>

我想提取的数据应该来自这些标签:

                     <td>2.660.784</td> 
                     <td>2.944.552</td> 
                     <td>Correct, has 3 td elements</td> 

我设法创建了返回表的整个内容的函数,但是我想从结果中排除<th>节点,并且只返回来自<td>节点的数据,我可以使用哪些内容用于进一步解析。任何人都可以帮我这个吗?

1 个答案:

答案 0 :(得分:1)

点缀这样的东西

(ns tutorial.so-scrape
  (:require [net.cgrand.enlive-html :as html])

(defn parse-tds [url] 
 (html/select (html/html-resource (java.net.URL. url)) [:table :td])) 

应该为您提供所有td个节点的序列,其形式为{:tag :td :attrs {...} :content (...)}。我不知道enlive让您可以直接获取这些节点的内容。我错了。

然后,您可以提取序列的内容 (for [line ws-content] (apply str (:content line)))

关于question you posted yesterday(我假设您仍在使用该页面) - 我给出的解决方案有点复杂 - 但它也很灵活。例如,如果您更改tag-type函数,就像这样

(defn tag-type [node]
  (case (:tag node) 
   :td    ::TerminalNode
   ::IgnoreNode)

(将所有节点的返回值更改为::IgnoreNode:td之外,它只是为您提供:td的内容序列,这可能接近您想要的内容如果你需要更多的帮助,请告诉我。

编辑(回复以下评论) 我不认为单独使用基于:content的{​​{1}}选择节点是可能的 - 但你当然可以使用Clojure来实现。

例如,您可以执行类似

的操作
(for [line ws-content :when (re-find (re-pattern "WHAT YOU WANT TO MATCH") (:content line))]
  (:content line))

可行。 (你可能需要稍微调整(:content line)表格..