3

有人可以解释一下如何从具有内容值的<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>,我可以使用这些内容进行进一步的解析。谁能帮我这个?

4

1 回答 1

2

活像这样

(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)))

关于您昨天发布的问题(我假设您仍在使用该页面)-我在那里提供的解决方案有点复杂-但它也很灵活。例如,如果您tag-type像这样更改功能

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

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

编辑(回复下面的评论)我不认为:content仅使用 enlive 就可以根据节点选择节点 - 但您当然可以使用 Clojure 这样做。

例如你可以做类似的事情

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

可以工作。(你可能需要(:content line)稍微调整一下表格..

于 2011-10-19T07:54:22.207 回答