cheeriojs解析问题:在我的NodeJs应用程序中找不到<a> tag?

时间:2017-01-23 08:31:13

标签: javascript html node.js cheerio

Background

I'm parsing a HTML page using cheeriojs。 目标是从该页面获取一系列链接。

问题

图书馆运作良好,但我对一组特定标签(两个<a>标签)有疑问, 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 <a href="/wiki/Defense" title="Defense">Defense</a> Reward一起出现。

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

<div class="pi-data-value pi-font"><a href="/wiki/Orokin_Vault" title="Orokin Vault" class="mw-redirect">Orokin Vault</a></div>

或者这个:

<a href="/wiki/Lynx_Osprey" title="Lynx Osprey">Lynx Osprey</a>

问题

此时可能是::

  1. 我在HTML源代码中有特殊的隐形邪恶角色,而cheerio并不喜欢。
  2. cheerio只会在其他标签中找到<a>个标签,或者如果它们是独立的。
  3. 我已经测试了第一个选项,但结果没有改变。所以现在我倾向于认为这个问题是第二个选择,我发现这个选择非常有限。

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

    我该如何使这项工作?有什么建议?

1 个答案:

答案 0 :(得分: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);

...输出:

find: 1
filter 2
combined: 3

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