2013-11-19 6 views
1

Я пытаюсь отменить некоторые данные PubMed, используя cheerio. Следующий скрипт работает нормально, но когда какой-либо тэг xml не существует, он генерирует ошибочно упорядоченный вывод.соскабливание вложенного xml с помощью cheerio

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()); 
     }; 
}); 

В этом примере абстрактные выходы под первым заголовком вместо второго, потому что первая статья не содержит абстрактных.

ответ

3

Наконец, я думаю, что я мог бы преодолеть это, используя другую стратегию:

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); 
+0

ли вышеприведенный код будет работать? – JohnAllen

+0

Да. Вы находите ошибки/предложения? – panchtox