Frage

Könnte mir jemand erklären, wie man Inhalte aus kratzt <td> Tags, wo die <th> hat Inhaltswert (in diesem Fall brauche ich Inhalte von <b> Tag für den passenden Vorgang) "Row1 -Titel", jedoch ohne Scraping <th> Tag (oder eines seiner Inhalte) in Bearbeitung? Hier ist mein Test 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>

Daten, die ich extrahieren möchte, sollten aus diesen Tags stammen:

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

Ich habe es geschafft, Funktionen zu erstellen, die den gesamten Inhalt der Tabelle zurückgibt, aber ich möchte das ausschließen <th> Knoten aus dem Ergebnis und nur Daten aus zurückzugeben <td> Knoten, welchen Inhalt ich zum weiteren Parsen verwenden kann. Kann mir jemand dabei helfen?

War es hilfreich?

Lösung

Mit so etwas ausgießen

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

sollte Ihnen eine Sequenz von allen geben td Knoten, etwas von der Form {:tag :td :attrs {...} :content (...)}. Ich bin mir nicht bewusst, dass Enlive Ihnen die Möglichkeit gibt, den Inhalt dieser Knoten direkt zu erhalten. Ich könnte falsch liegen.

Sie könnten dann den Inhalt der Sequenz für etwas in der Reihe von Zeilen von extrahieren
(for [line ws-content] (apply str (:content line)))

In Bezug auf die Frage, die Sie gestern gepostet haben (Ich gehe davon aus, dass Sie immer noch mit dieser Seite arbeiten) - die Lösung, die ich dort gegeben habe, war ein wenig komplex - aber es ist auch flexibel. Zum Beispiel, wenn Sie die ändern tag-type Funktion so

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

(Ändern Sie den Rückgabewert aller Knoten auf ::IgnoreNode ausser für :td Dann gibt es Ihnen nur eine Abfolge des Inhalts des :tdS Was ist wahrscheinlich nahe an dem, was Sie wollen. Lassen Sie mich wissen, wenn Sie mehr Hilfe benötigen.

BEARBEITEN (Als Antwort auf Kommentare unten) Ich glaube nicht, dass die Auswahl von Knoten basierend auf ihrem :content ist mit Enlive allein möglich - aber Sie können dies mit Clojure sicherlich tun.

Zum Beispiel könnten Sie so etwas tun wie

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

könnte klappen. (Möglicherweise müssen Sie das optimieren (:content line) bilden ein wenig ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top