3

誰かがコンテンツ値(実際にはこの場合、マッチング操作のためにタグのコンテンツが必要)「Row1title」を持つ<td>タグからコンテンツをスクレイピングする方法を説明できますが、タグ(またはそのコンテンツ)をスクレイピングする必要はありませんか?これが私のテストHTMLです:<th><b><th>

<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

このようなものをenliveで

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

(すべてのノードの戻り値を を::IgnoreNode除いて変更すると、おそらくあなたが望むものに近い s:tdの内容のシーケンスが得られます: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 に答える