使用apoc.load.html时,是否可以返回完整的HTML,而不仅仅是文本?

时间:2018-12-07 12:51:04

标签: css neo4j css-selectors jsoup neo4j-apoc

让我们说我要刮取在以下位置找到的Neo4j RefCard https://neo4j.com/docs/cypher-refcard/current/

我想获取一个“代码”示例及其样式。这是我的目标。请注意,它具有css处理(字体,颜色...)。

enter image description here

...因此在Neo4j中,我调用了apoc.load.html过程,如下所示,您可以看到查找内容没有问题。

enter image description here

它返回带有三个键的地图:tagName,attribute和text。

enter image description here

文本是我的问题。它没有所有样式。我希望借此让我更多地了解本文不同部分的样式。

网页中的实际HTML带有所有以下span类标记:cm-string,cm-node,cm-atom等。请注意,这不是Neo4j的apoc.load.html过程生成的。它直接来自我的Chrome浏览器的检查控制台。

enter image description here

我不需要实际的字体和颜色,只需标记名称。

我在documentation中看到可以提供一个可选的“ config”映射。但是没有说明可以在那里配置什么。如果我可以将其配置为返回html而不是文本,那将是一件很可爱的事情。

enter image description here

Neo4j在此处用于CSS选择的库为jsoup

因此,我希望不剥离span标签,否则,请为每个文本段提取其类名。

2 个答案:

答案 0 :(得分:0)

您是否不能自己从对象的属性中生成HTML?看起来它们都是具有3个不同类的span标签,具体取决于您使用的是属性名称,属性值还是属性分隔符?

这可能就是他们自己生成HTML的方式。

答案 1 :(得分:0)

好的,两年后我重新审视了我发布的这个问题,并找到了解决方案。我会保持简短。

APOC 过程 CALL apoc.load.html 使用的是抓取库 Jsoup,它不是一个成熟的浏览器。当它访问一个页面时,它会读取服务器发送的 html,但会忽略任何 javascript。因此,如果页面使用 javascript 插入内容,甚至只是格式化内容,那么 Jsoup 将错过 javascript 运行时生成的 html。

所以我刚刚在 prerender.com 上试用了该服务。使用起来很简单。您向它发送一个 URL,它将您的 url 作为参数并获取该页面本身并执行该页面的 javascript。它将最终结果作为静态 HTML 返回。

因此,如果我只使用 apoc.load.html 调用 prerender.com,那么 Jsoup 库将简单地请求 html,这次它将获得完全呈现的 html。 :)

您可以尝试以下两个查询并查看预渲染的不同之处。此页面中的 span 标签仅由 javascript 呈现。因此,如果我们调用它在没有预渲染的情况下要求它的 span 标签,我们将不会得到任何返回。

CALL apoc.load.html("https://neo4j.com/docs/cypher-refcard/current/", {target:".listingblock pre:contains(age: 38) span"}) YIELD value
UNWIND value.target AS spantags
RETURN spantags

...但如果我们通过 prender.com 网站调用它,您将获得一堆 span 标签及其内容。

CALL apoc.load.html("https://service.prerender.cloud/https://neo4j.com/docs/cypher-refcard/current/", {target:".listingblock pre:contains(age: 38) span"}) YIELD value
UNWIND value.target AS spantags
RETURN spantags