代码之家  ›  专栏  ›  技术社区  ›  user7151151

做与文件等效的工作。getElementsByClassName(),带有cheerio和用于web抓取的url

  •  1
  • user7151151  · 技术社区  · 7 年前

    enter image description here

    这是在浏览器中工作,但当我试图用cheerio和node做同样的事情时。js它不工作:

    var request = require('request');
    var cheerio = require('cheerio');
    var url = 'https://www.google.fr/search?ei=apX6WdzaIMzWUabjqvAF&q=ok&oq=ok&gs_l=psy-ab.3..0i67k1l4j0j0i67k1l2j0i131k1j0j0i67k1.2633.3962.0.4021.3.3.0.0.0.0.58.169.3.3.0....0...1.1.64.psy-ab..0.3.169....0.524Rrv-4zlU'
    
    request(url, function (error, response, html) {
      if (!error && response.statusCode == 200) {
        var $ = cheerio.load(html);
        console.log($('.r')[0].innerText);
      }
    });
    

    我从未使用过cheerio,这段代码在终端中给了我未定义的消息,为什么?

    1 回复  |  直到 7 年前
        1
  •  2
  •   jfriend00    7 年前

    根据 cheerio doc ,看起来您可以使用:

    $('.r').first().text()
    

    $('.r').eq(0).text()
    

    我不知道cheerio是否像jQuery一样支持直接数组访问,因为这些不是真正的DOM对象(而是由cheerio创建的伪对象),我看不到任何对 .innerText 事实上,在Cheerio文档中,Github搜索“innerText”也没有得到任何点击。看起来你可以用 .html() .text() 在Cheerio集合对象上。

    如果你得到一个特定的节点对象,就像你可能一直在尝试做的那样 $('.r')[0] ,然后是该节点对象(不同于cheerio集合对象)上支持的属性 are listed here 具体如下:

    tagName
    parentNode
    previousSibling
    nextSibling
    nodeValue
    firstChild
    childNodes
    lastChild
    

    因此,如果您得到实际的节点对象,您可能会使用:

    $('.r').get(0).nodeValue
    

    这将获得节点的原始内容。我希望早些时候 .文本() 示例可能是获得结果的更安全、更容易的方法。