Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何使用Enlive从指定的标记中刮取数据?_Clojure_Screen Scraping_Enlive - Fatal编程技术网

Clojure 如何使用Enlive从指定的标记中刮取数据?

Clojure 如何使用Enlive从指定的标记中刮取数据?,clojure,screen-scraping,enlive,Clojure,Screen Scraping,Enlive,有人能告诉我如何从标签中刮取内容,而标签具有内容值(实际上在这种情况下,我需要标签的内容进行匹配操作)“Row1 title”,但不在过程中刮取标签(或其任何内容)?以下是我的测试HTML: <table class="table_class"> <tbody> <tr> <th>

有人能告诉我如何从
标签中刮取内容,而
标签具有内容值(实际上在这种情况下,我需要
标签的内容进行匹配操作)“Row1 title”,但不在过程中刮取
标签(或其任何内容)?以下是我的测试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>

第1行标题
2.660.784 
2.944.552 
正确,有3个td元素
第2行标题
2.660.784 
2.944.552 
正确,有3个td元素
我要提取的数据应该来自以下标签:

                     <td>2.660.784</td> 
                     <td>2.944.552</td> 
                     <td>Correct, has 3 td elements</td> 
2.660.784
2.944.552 
正确,有3个td元素

我已经设法创建了返回表的全部内容的函数,但是我想从结果中排除
节点,并且只从
节点返回数据,我可以使用这些内容进行进一步的解析。有人能帮我做这个吗?

用像这样的英语

(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可以让您直接获取这些节点的内容。我可能错了

然后,您可以按照
(对于[行ws内容](应用str(:内容行))

关于(我假设您仍在使用该页面)问题,我给出的解决方案有点复杂,但也很灵活。例如,如果您像这样更改
标记类型
函数

(defn tag-type [node]
  (case (:tag node) 
   :td    ::TerminalNode
   ::IgnoreNode)
(将所有节点的返回值更改为
::IgnoreNode
,除了
:td
,然后它只会为您提供一系列
:td
的内容,这些内容可能与您想要的内容接近。如果您需要更多帮助,请告诉我

编辑(回复以下评论) 我不认为仅使用enlive就可以根据节点的
:内容
来选择节点,但使用Clojure肯定可以做到这一点

例如,你可以做如下事情

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

可以。(您可能需要稍微调整一下
(:content line)
表单。

(伪代码)
(map#(html/select%[:th:b(“其中:b标记的内容等于“UKUPNA AKTIVA”))))(删除nil?(map get-data-balance\u表(h3+表)http://www.belex.rs/trgovanje/prospekt/VZAS/show"))))
我得到(()),但如果只有th,我得到表中所有th元素的序列。我只想要一个包含内容为“UKUPNA AKTIVA”的
元素“。我将尝试使用此结果来获取他之后的
节点。我跳到的结果是元素序列,其中th标记(或在我的情况下是b标记)具有指定值。我认为仅使用enlive无法实现您想要的功能-它根据节点id和类选择节点,而不是根据其内容(据我所知)。但你当然可以用Clojure做到这一点——我看不出你为什么不这样做(见答案中的更改)。你发布的编辑对我来说非常有用。与此同时,我设法找到了一些代码,这使我能够做同样的事情,但你的代码更优雅。这是我的代码(或者准确地说,是一个繁重的黑客):
(应用str(展平)(地图:内容(展平)(地图#(html/select%[:th:b)))删除nil?(地图获取-数据-资产负债表(h3+表格)http://www.belex.rs/trgovanje/prospekt/VZAS/show)好吧,另一方面,你的要短得多;)祝你好运,和clojure玩得开心!