用Axios抓取后如何将对象推送到JSON文件?

问题描述

因此,我设法从URL获得了我想要的一切。现在,我想将该对象写入“ verified.json”文件中。问题在于,只有我对象中的最后一项被写入那里,而另一项却被写入,表明它显然在某个地方坏了。

我是这个菜鸟,所以对解决方案的解释将不胜感激。

const axios = require("axios");
const cheerio = require("cheerio");
const fs = require('fs');
const colors = require("colors");
prodArray = {};

axios.get("https://arstechnica.com/gadgets/").then(urlResponse => {
  const $ = cheerio.load(urlResponse.data);

  $('li.article').each((i,elem) => {

    const link = $(elem).find("a.overlay").attr("href");
    //console.log(link.cyan);
    
    const header = $(elem).find("h2").text();
    //console.log(header);

    const author = $(elem).find("p.byline").find("a").text();
    //console.log(author);
    console.log("---------------\n".red);

    data = {
      "Link: ": link,"Title: ": header,"Author: ": author
    }

    let dataStringfy = JSON.stringify(data);

    let test = fs.writeFile("verified.json",dataStringfy,function (err) {
      if (err) {
        console.log(err)
      } else {
        console.log("Success")
      }
    })
    console.log(test);
  })
})


解决方法

您可以在写入文件之前先插入数组

var datas = [];

$('li.article').each((i,elem) => {

    const link = $(elem).find("a.overlay").attr("href");
    //console.log(link.cyan);
    
    const header = $(elem).find("h2").text();
    //console.log(header);

    const author = $(elem).find("p.byline").find("a").text();
    //console.log(author);
    console.log("---------------\n".red);

    data = {
      "Link: ": link,"Title: ": header,"Author: ": author
    }

    datas.push(data);

});

let dataStringfy = JSON.stringify(datas);

let test = fs.writeFile("verified.json",dataStringfy,function (err) {
      if (err) {
        console.log(err)
      } else {
        console.log("Success")
      }
    })
,

我认为这样效果更好

const arr = []
$('li.article').each((i,elem) => {
  const link = $(elem).find("a.overlay").attr("href");
  const header = $(elem).find("h2").text();
  const author = $(elem).find("p.byline").find("a").text();
  arr.push({
    "Link": link,"Title": header,"Author": author
  })
})
let dataStringfy = JSON.stringify(arr);
console.log(dataStringfy)

const $doc = $($("xmp").text());
const arr = []
$('li.article',$doc).each((i,"Author": author
  })
})
let dataStringfy = JSON.stringify(arr);
console.log(dataStringfy)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<xmp><!DOCTYPE html>
<html lang="en-us">
<head>
<title>Tech | Ars Technica</title>
    
</head>
<body class="archive category category-gadgets category-22 grid-view light blog-us">

        
  <main id="main" class="content-wrapper">
<h1 id="archive-head" class="archive-title">
        <span class="archive-name">Tech</span>
        <span class="divider"> / </span>
    <span class="archive-desc">Product News &amp; Reviews</span>
        </h1>
  
  <section class="with-xrail">
    <!-- Horizontal listing -->
    <div class="listing listing-latest ">
      <ol>
              
<li class="tease article " data-post-id="1710163">
  
  <a class="overlay" href="https://arstechnica.com/gadgets/2020/09/roku-starts-taking-orders-for-an-updated-ultra-player-and-a-new-soundbar/" tabindex="-1" role="presentation" aria-hidden="true"></a>
    <figure>
    <div class="listing listing-small" style="background-image:url('https://cdn.arstechnica.net/wp-content/uploads/2020/09/http-image.roku_.com-w-rapid-images-pdp-carousel-items-993bcf95-553f-4000-b795-981bed77c3cc-1-150x150.png');"></div>
        <a class="overlay" href="https://arstechnica.com/gadgets/2020/09/roku-starts-taking-orders-for-an-updated-ultra-player-and-a-new-soundbar/" tabindex="-1" role="presentation" aria-hidden="true"></a>
          </figure>
  <header>
        <h2><a href="https://arstechnica.com/gadgets/2020/09/roku-starts-taking-orders-for-an-updated-ultra-player-and-a-new-soundbar/">Roku’s big announcements today: A new Ultra player,soundbar,and AirPlay 2 support</a></h2>
    <p class="excerpt">Roku finally supports Dolby Vision in the new Ultra player.</p>
    
  <p class="byline" itemprop="author creator" itemscope itemtype="http://schema.org/Person">
      <a itemprop="url" href="https://arstechnica.com/author/samuelaxon/"><span itemprop="name">Samuel Axon</span></a>
    –  <time class="date" data-time="1601331587" datetime="2020-09-28T22:19:47+00:00">Sep 28,2020 10:19 pm UTC</time>
  </p>

  </header>
    <footer>
        <div class="comments-hotness ">
  <a title="40 posters participating" class="comment-count icon-comment-bubble-up" href="https://arstechnica.com/gadgets/2020/09/roku-starts-taking-orders-for-an-updated-ultra-player-and-a-new-soundbar/?comments=1">
    
  <span class="comment-count-number">53</span>
  <span class="visually-hidden"> comments with 40 posters participating</span>
  </a>
    </div>

  </footer>
  
</li>
 
              
<li class="tease article " data-post-id="1710267">
  
  <a class="overlay" href="https://arstechnica.com/gaming/2020/09/apple-vs-epic-hearing-previews-a-long-hard-fought-trial-to-come/" tabindex="-1" role="presentation" aria-hidden="true"></a>
    <figure>
    <div class="listing listing-small" style="background-image:url('https://cdn.arstechnica.net/wp-content/uploads/2018/07/fortnite-150x150.jpeg');"></div>
        <a class="overlay" href="https://arstechnica.com/gaming/2020/09/apple-vs-epic-hearing-previews-a-long-hard-fought-trial-to-come/" tabindex="-1" role="presentation" aria-hidden="true"></a>
          </figure>
  <header>
        <h2><a href="https://arstechnica.com/gaming/2020/09/apple-vs-epic-hearing-previews-a-long-hard-fought-trial-to-come/">Apple vs. Epic hearing previews a long,hard-fought trial to come</a></h2>
    <p class="excerpt">Judge Rogers has strong words for both sides in the iOS <em>Fortnite</em> battle.</p>
    
  <p class="byline" itemprop="author creator" itemscope itemtype="http://schema.org/Person">
      <a itemprop="url" href="https://arstechnica.com/author/kyle-orland/"><span itemprop="name">Kyle Orland</span></a>
    –  <time class="date" data-time="1601330128" datetime="2020-09-28T21:55:28+00:00">Sep 28,2020 9:55 pm UTC</time>
  </p>

  </header>
    <footer>
        <div class="comments-hotness ">
  <a title="94 posters participating,including story author" class="comment-count icon-comment-bubble-up" href="https://arstechnica.com/gaming/2020/09/apple-vs-epic-hearing-previews-a-long-hard-fought-trial-to-come/?comments=1">
    
  <span class="comment-count-number">190</span>
  <span class="visually-hidden"> comments with 94 posters participating,including story author</span>
  </a>
    </div>

  </footer>
  
</li>
 
              
<li class="tease article " data-post-id="1710247">
  
  <a class="overlay" href="https://arstechnica.com/information-technology/2020/09/joker-the-malware-that-signs-you-up-for-pricey-services-floods-android-markets/" tabindex="-1" role="presentation" aria-hidden="true"></a>
    <figure>
    <div class="listing listing-small" style="background-image:url('https://cdn.arstechnica.net/wp-content/uploads/2018/01/android-malware-150x150.jpg');"></div>
        <a class="overlay" href="https://arstechnica.com/information-technology/2020/09/joker-the-malware-that-signs-you-up-for-pricey-services-floods-android-markets/" tabindex="-1" role="presentation" aria-hidden="true"></a>
          </figure>
  <header>
        <h2><a href="https://arstechnica.com/information-technology/2020/09/joker-the-malware-that-signs-you-up-for-pricey-services-floods-android-markets/">“Joker”—the malware that signs you up for pricey services—floods Android markets</a></h2>
    <p class="excerpt">Dozens of malicious apps,some available in Play,found in the past couple months.</p>
    
  <p class="byline" itemprop="author creator" itemscope itemtype="http://schema.org/Person">
      <a itemprop="url" href="https://arstechnica.com/author/dan-goodin/"><span itemprop="name">Dan Goodin</span></a>
    –  <time class="date" data-time="1601328069" datetime="2020-09-28T21:21:09+00:00">Sep 28,2020 9:21 pm UTC</time>
  </p>

  </header>
    <footer>
        <div class="comments-hotness ">
  <a title="37 posters participating" class="comment-count icon-comment-bubble-up" href="https://arstechnica.com/information-technology/2020/09/joker-the-malware-that-signs-you-up-for-pricey-services-floods-android-markets/?comments=1">
    
  <span class="comment-count-number">68</span>
  <span class="visually-hidden"> comments with 37 posters participating</span>
  </a>
    </div>

  </footer>
  
</li>
 
              
<li class="tease article " data-post-id="1710179">
  
  <a class="overlay" href="https://arstechnica.com/gadgets/2020/09/amazon-prime-day-was-just-announced-and-some-deals-have-already-started/" tabindex="-1" role="presentation" aria-hidden="true"></a>
    <figure>
    <div class="listing listing-small" style="background-image:url('https://cdn.arstechnica.net/wp-content/uploads/2020/09/PR_Hero_Gift_US_en-150x150.jpg');"></div>
        <a class="overlay" href="https://arstechnica.com/gadgets/2020/09/amazon-prime-day-was-just-announced-and-some-deals-have-already-started/" tabindex="-1" role="presentation" aria-hidden="true"></a>
          </figure>
  <header>
        <h2><a href="https://arstechnica.com/gadgets/2020/09/amazon-prime-day-was-just-announced-and-some-deals-have-already-started/">Amazon Prime Day was just announced,and some deals have already started</a></h2>
    <p class="excerpt">Did you really think Amazon was going to let 2020 slip by without a Prime Day?</p>
    
  <p class="byline" itemprop="author creator" itemscope itemtype="http://schema.org/Person">
      <a itemprop="url" href="https://arstechnica.com/author/coreygaskin/"><span itemprop="name">Corey Gaskin</span></a>
    –  <time class="date" data-time="1601318425" datetime="2020-09-28T18:40:25+00:00">Sep 28,2020 6:40 pm UTC</time>
  </p>

  </header>
    <footer>
        <div class="comments-hotness ">
  <a title="45 posters participating" class="comment-count icon-comment-bubble-up" href="https://arstechnica.com/gadgets/2020/09/amazon-prime-day-was-just-announced-and-some-deals-have-already-started/?comments=1">
    
  <span class="comment-count-number">58</span>
  <span class="visually-hidden"> comments with 45 posters participating</span>
  </a>
    </div>

  </footer>
  
</li>
 
              
<li class="tease article " data-post-id="1707888">
  
  <a class="overlay" href="https://arstechnica.com/gadgets/2020/09/youtube-celebrates-deaf-awareness-week-by-killing-crowd-sourced-captions/" tabindex="-1" role="presentation" aria-hidden="true"></a>
    <figure>
    <div class="listing listing-small" style="background-image:url('https://cdn.arstechnica.net/wp-content/uploads/2015/05/youtube-150x150.jpg');"></div>
        <a class="overlay" href="https://arstechnica.com/gadgets/2020/09/youtube-celebrates-deaf-awareness-week-by-killing-crowd-sourced-captions/" tabindex="-1" role="presentation" aria-hidden="true"></a>
          </figure>
  <header>
        <h2><a href="https://arstechnica.com/gadgets/2020/09/youtube-celebrates-deaf-awareness-week-by-killing-crowd-sourced-captions/">YouTube celebrates Deaf Awareness Week by killing crowd-sourced captions</a></h2>
    <p class="excerpt">500,000 signatures aren't stopping YouTube from shutting down accessibility feature.</p>
    
  <p class="byline" itemprop="author creator" itemscope itemtype="http://schema.org/Person">
      <a itemprop="url" href="https://arstechnica.com/author/ronamadeo/"><span itemprop="name">Ron Amadeo</span></a>
    –  <time class="date" data-time="1601316664" datetime="2020-09-28T18:11:04+00:00">Sep 28,2020 6:11 pm UTC</time>
  </p>

  </header>
    <footer>
        <div class="comments-hotness ">
  <a title="85 posters participating" class="comment-count icon-comment-bubble-up" href="https://arstechnica.com/gadgets/2020/09/youtube-celebrates-deaf-awareness-week-by-killing-crowd-sourced-captions/?comments=1">
    
  <span class="comment-count-number">106</span>
  <span class="visually-hidden"> comments with 85 posters participating</span>
  </a>
    </div>

  </footer>
  
</li>
 
      </ul> 
</body>
</html></xmp>