使用cheerio刮嵌套的xml

我试图用cheerio来取消一些PubMed数据。 以下脚本可以正常工作,但是当某个xml标签不存在时,它会生成错误的输出。

var request = require('request'), cheerio = require('cheerio'); request('http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&id=23545583,23103438', function(error, response, body) { var $ = cheerio.load(body); for (var i = 0; i < $('PubmedArticle').length; i++) { console.log($('PubmedArticle PMID').slice(0).eq(i).text()); console.log($('PubmedArticle DateCreated Year').slice(0).eq(i).text()); console.log($('PubmedArticle ArticleTitle').slice(0).eq(i).text()); console.log($('PubmedArticle Abstract AbstractText').slice(0).eq(i).text()); }; }); 

在这个例子中,第一个标题下方的抽象输出代替第二个,因为第一个文章不包含抽象。

最后,我想我可以用一个不同的策略来克服这个问题:

 var $ = require('cheerio') var request = require('request') function gotXML(err, resp, xml) { if (err) return console.error(err) var parsedXML = $.load(xml) parsedXML('PubmedArticle').map(function(i, article) { console.log($(article).find('pmid')[0].children[0].data); console.log($(article).find('articletitle')[0].children[0].data); console.log($(article).find('datecreated year')[0].children[0].data); if ($(article).find('abstracttext').length>0) { console.log($(article).find('abstracttext')[0].children[0].data); }; } ); } var domain = 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&id=23545583,23103438'; request(domain, gotXML);