有人可以解释我如何从<td>
标记中抓取内容<th>
具有内容值(实际上在这种情况下,我需要<b>
标记的内容以进行匹配操作)“Row1标题“,但是没有抓取<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>
节点的数据,我可以使用哪些内容用于进一步解析。任何人都可以帮我这个吗?
答案 0 :(得分:1)
点缀这样的东西
(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)))
关于question you posted yesterday(我假设您仍在使用该页面) - 我给出的解决方案有点复杂 - 但它也很灵活。例如,如果您更改tag-type
函数,就像这样
(defn tag-type [node]
(case (:tag node)
:td ::TerminalNode
::IgnoreNode)
(将所有节点的返回值更改为::IgnoreNode
除:td
之外,它只是为您提供:td
的内容序列,这可能接近您想要的内容如果你需要更多的帮助,请告诉我。
编辑(回复以下评论)
我不认为单独使用基于:content
的{{1}}选择节点是可能的 - 但你当然可以使用Clojure来实现。
(for [line ws-content :when (re-find (re-pattern "WHAT YOU WANT TO MATCH") (:content line))]
(:content line))
可行。 (你可能需要稍微调整(:content line)
表格..