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玩得开心!