Node.js Cheerio XML

6

我有以下代码,目前已经可以正常获取:

<troveUrl>http://trove.nla.gov.au/work/23043869</troveUrl> 

但是我想从同一页中获取以下内容中'id'后面的值,但却无法获取它!

<work id="23043869" url="/work/23043869">

这是我目前拥有的代码

var request = require ('request'),
    cheerio = require ('cheerio');
    request('http://api.trove.nla.gov.au/result?key=6k6oagt6ott4ohno&zone=book&q-year1-date=2000&l-advformat=Thesis&l-australian=y&q-term2=&q-term3=&q-term0=&q-field1=title%3A&q-type2=all&q-field0=&q-term1=&q-type3=all&q-field3=subject%3A&q-type0=all&q-field2=creator%3A&q-type1=all&l-availability=y%2Ff&q=+date%3A[2000+TO+2014]&q-year2-date=2014&n=1', function (error, response, html) {
      if (!error && response.statusCode == 200) {
        var $ = cheerio.load(html);
        $('troveurl').each(function(i, element){
          var id = $(this);
          console.log(id.text());
        });
      }
    });

任何帮助都表示感激。

1
console.log(element.attr('id'));这段代码可以工作吗? - laggingreflex
2个回答

22

在选项对象中添加 xmlMode: true,然后您就可以将其解析为XML格式。

接下来,您可以使用 $('tag').attr('attribute')$('tag').text() 获取标签和数据,以获取标签之间的数据,就像您所做的那样。

var request = require('request'),
    cheerio = require('cheerio');
request('http://api.trove.nla.gov.au/result?key=6k6oagt6ott4ohno&zone=book&q-year1-date=2000&l-advformat=Thesis&l-australian=y&q-term2=&q-term3=&q-term0=&q-field1=title%3A&q-type2=all&q-field0=&q-term1=&q-type3=all&q-field3=subject%3A&q-type0=all&q-field2=creator%3A&q-type1=all&l-availability=y%2Ff&q=+date%3A[2000+TO+2014]&q-year2-date=2014&n=1', function(error, response, html) {
    if (!error && response.statusCode == 200) {
        var $ = cheerio.load(html, {
          xmlMode: true
        });
        console.log($('work').attr('id'))
    }
});

1
@user1222447 下次你可以通过在源代码中搜索期望的注释或期望的术语(而不是在 Google 提供的完整文本问题中搜索)来跟踪它。例如,在 cheerio 代码库 https://github.com/cheeriojs/cheerio/search?q=xml&type=Code 中搜索 xml 一词,可以显示有一些影响行为的 xmlMode 变量。这还不够,但我猜这就是本次或以前 Ben 使用的东西。 - xmojmr
如果您将 xmlMode: true 传递给代码,则代码仍应正常工作。 - Jun Yin
1
xmlMode现在已更名为xml - ggorlen

-1
实际问题在于您使用的语法来获取'id'后面的值。以下代码不会将id打印出来。
var id = $(this);
console.log(id.text());

正确的语法应该是$('your element').attr('id'),就像上面Ben Fortune的答案中提到的那样。但是,在选项对象中传递xmlMode: true并不是必须的。如果您使用正确的语法,传递xmlMode: false也可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接