4

我在nodejs 中使用cheerio 来解析一些RSS 提要。我正在抓取所有将它们放入数组中的项目。我正在使用 3 个测试提要,每个“项目”元素都有一个“描述”子元素。在其中一个提要中,整个“描述”被包装为 CDATA,我无法获得它的价值。这是一个简短的代码片段

//Open the xml document with cheerio
$ = cheerio.load(arrXmlDocs[i],{ ignoreWhitespace : true, xmlMode : true});

//Loop through every item
$('item').each(function(i, xmlItem){

    //array to hold each item being converted into an array
    var tempArray = [];

    //Loop through each child of <item>
    $(xmlItem).children().each(function(i, xmlItem){
        //Get the name 
        tempArray[$(this)[0].name] = $(this).text();
    }

}

正如预期的那样,两个没有 CDATA 的 rss 提要给了我一个像这样的数组

[
    [
        name: 'name of episode',
        description:'description of episode',
        pubdate: 'published date'
    ],
    [
        name: 'name of episode',
        description:'description of episode',
        pubdate: 'published date'
    ]
]

带有 CDATA 描述的提要看起来像这样

    [
        name: 'name of episode',
        pubdate: 'published date'
    ],

所以我的问题是:为什么cheerio 不返回包含在 CDATA 中的值/我怎样才能让它返回这些值。

4

1 回答 1

7

这是cheerio的一个已知问题相关)。CDATA在您的情况下,它还无法从 XML 创建正确的树。我知道这是一个令人失望的答案,它是 WIP。

它正在处理中,同时,您可以CDATA使用正则表达式删除。

arrXmlDocs[i].replace(/<!\[CDATA\[([\s\S]*?)\]\]>(?=\s*<)/gi, "$1");

这是一个示例jsfiddle的链接。

虽然这不是一个理想的解决方案,但在他们解决这个问题之前应该足够了。

于 2013-03-26T19:01:11.260 回答