Как очистить данные из указанного тега с помощью Enlive? - PullRequest
3 голосов
/ 19 октября 2011

может кто-нибудь объяснить мне, как очистить содержимое от тегов <td>, где <th> имеет значение содержимого (на самом деле в этом случае мне нужно содержимое тега <b> для операции сопоставления) "Заголовок строки1", но без очистки <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 Ответ

1 голос
/ 19 октября 2011

С оживлением что-то вроде этого

(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 (...)}. Я не знаю, чтоivelive дает вам возможность получать содержимое этих узлов напрямую. Я могу ошибаться.

Затем вы можете извлечь содержимое последовательности для чего-то вроде
(for [line ws-content] (apply str (:content line)))

Относительно вопроса , который вы отправили вчера (я полагаю, вы все еще работаете с этой страницей) - решение, которое я там дал, было немного сложным - но оно также и гибкое. Например, если вы измените функцию tag-type следующим образом

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

(измените возвращаемое значение всех узлов на ::IgnoreNode, за исключением :td, тогда он просто дает вам последовательность содержимого :td s, которое, вероятно, близко к тому, что вы хотите. Дайте мне знать, если вы нужна дополнительная помощь.

РЕДАКТИРОВАТЬ (в ответ на комментарии ниже) Я не думаю, что выбор узлов на основе их :content возможен только с помощью liveive, но вы, безусловно, можете сделать это с Clojure.

например, вы можете сделать что-то вроде

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

может работать. (возможно, вам придется немного подправить форму (:content line) ..

...