【问题标题】:cheeriojs parsing issue : cannot find <a> tag?Cheeriojs 解析问题:找不到 <a> 标签?
【发布时间】:2017-06-07 16:52:43
【问题描述】:

背景

我在 NodeJs 应用程序中使用 cheeriojs 解析 HTML 页面。 目标是从该页面获取一系列链接。

问题

该库运行良好,但我对一组特定的标签(两个&lt;a&gt; 标签)有疑问,cheerio 无法识别我的挚爱!

<a href="/wiki/Orokin_Void" title="Orokin Void" class="mw-redirect">Orokin Void</a> <a href="/wiki/Storage_Containers" title="Storage Containers" class="mw-redirect">Containers</a>

我检查并仔细检查了标签的结构是否理想

因此,根据文档,以下代码将打印2

let htmlSource = '<a href="/wiki/Orokin_Void" title="Orokin Void" class="mw-redirect">Orokin Void</a> <a href="/wiki/Storage_Containers" title="Storage Containers" class="mw-redirect">Containers</a>';
let cheerioStuff = $(htmlSource).find("a").length;
console.print(cheerioStuff);

相反,它打印0。这令人着迷,至少对我而言。另一个字符串Corpus T3 &lt;a href="/wiki/Defense" title="Defense"&gt;Defense&lt;/a&gt; Reward 似乎也出现了同样的问题。

但是,它适用于以下一个:

&lt;div class="pi-data-value pi-font"&gt;&lt;a href="/wiki/Orokin_Vault" title="Orokin Vault" class="mw-redirect"&gt;Orokin Vault&lt;/a&gt;&lt;/div&gt;

或者这个:

&lt;a href="/wiki/Lynx_Osprey" title="Lynx Osprey"&gt;Lynx Osprey&lt;/a&gt;

问题

此时可能::

  1. 我的 HTML 源代码中有一些特殊的不可见的邪恶字符,这是 Cheerio 不喜欢的。
  2. cheerio 只会在其他标签中找到&lt;a&gt; 标签,或者如果它们单独存在。

我已经测试了第一个选项,但结果没有改变。所以现在我倾向于认为问题是第二种选择,我发现它非常有限。

它也可以是两者的结合,在这种情况下,我被彻底搞砸了。

我怎样才能做到这一点?有什么建议?

【问题讨论】:

  • 另一种可能性:如果这段 HTML 没有根标签,它将无法工作。例如,您是否尝试将这些 包装在
    中?

标签: javascript html node.js cheerio


【解决方案1】:

find 查找当前集合中元素的后代,但您的a 元素不是后代,它们当前集合(例如,顶层)。你会想要filter:

let cheerioStuff = $(htmlSource).filter("a").length;

...如果您想同时覆盖这两个基础,也可以是 filterfind 的组合:

let elements = $(htmlSource);
let cheerioStuff = elements.find("a").add(elements.filter("a")).length;

例如,这会输出2:

"use strict";
let $ = require('cheerio');

let htmlSource = '<a href="/wiki/Orokin_Void" title="Orokin Void" class="mw-redirect">Orokin Void</a> <a href="/wiki/Storage_Containers" title="Storage Containers" class="mw-redirect">Containers</a>';
let elements = $(htmlSource);
let cheerioStuff = elements.find("a").add(elements.filter("a")).length;
console.log(cheerioStuff);

...而这个:

"use strict";
let $ = require('cheerio');

let htmlSource = '<div><a href="/wiki/Orokin_Void" title="Orokin Void" class="mw-redirect">Orokin Void</a></div> <a href="/wiki/Orokin_Void" title="Orokin Void" class="mw-redirect">Orokin Void</a> <a href="/wiki/Storage_Containers" title="Storage Containers" class="mw-redirect">Containers</a>';
let elements = $(htmlSource);
console.log("find: " + elements.find("a").length);
console.log("filter " + elements.filter("a").length);
console.log("combined: " + elements.find("a").add(elements.filter("a")).length);

...输出:

找到:1 过滤器 2 合计:3

...因为我在div 中添加了一个。

【讨论】:

    猜你喜欢
    • 2022-01-15
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2023-03-17
    • 2011-03-08
    相关资源
    最近更新 更多