JSON输出与Node JS一团糟

Posted

技术标签:

【中文标题】JSON输出与Node JS一团糟【英文标题】:JSON Output is a mess with Node JS 【发布时间】:2021-12-03 11:13:27 【问题描述】:

我用 Node JS 创建了一个简单的网络爬虫来提取手表价格,代码如下:

import axios from 'axios'
import cheerio from 'cheerio'
import * as fs from 'fs'

let Array1=[];
let a = 0;
let b=1;

axios.get("URL").then((response) => 
  let $ = cheerio.load(response.data);
  $(".article-title").each((i, e) => 
    let title = $(e).text();
    Array1[a] = title;
    a = a+2;
    
  
  )
  
  $(".article-price").each((i, e) => 
    let price = $(e).text();
    Array1[b] = price;
    b = b+2;
  
  )

  let data = JSON.stringify(Array1);
  fs.writeFileSync('sub.json', data);

);

但是,JSON 输出如下:

["\n         Rolex Submariner 5513 Maxi MK5 Dial","\n            \n      \n         16 000 €\n   ","\n         Rolex Submariner Black Dial Date 41mm - 2021 - 126610LN","\n            \n      \n         14 839 €\n   ","\n         Rolex Black Dial Submariner Date 41mm - 2021 Card - 126610ln","\n            \n      \n         14 839 €\n   ","\n         Rolex Submariner Meter First  MK1","\n            \n      \n         15 416 €\n   ","\n         Rolex Submariner 16610 military NATO 1994 S series","\n            \n      \n         35 000 €\n   ","\n         Rolex Submariner 126610LV Starbucks NEW 06/2021 Full set","\n            \n      \n         17 400 €\n   ","\n         Rolex 06/2021 - Submariner Date 126610 LN 99%new","\n            \n      \n         13 300 €\n   ","\n         Rolex Submariner 6536 Gilt James Bond 1956","\n            \n      \n         33 000 €\n   ","\n         Rolex Submariner Date Starbucks Automatik Edelstahl Herrenuhr...","\n            \n      \n         17 770 €\n   ","\n         Rolex Submariner","\n            \n      \n         12 500 €\n   ","\n         Rolex Submariner Date NOS avec stickers","\n            \n      \n         17 900 €\n   ","\n         Rolex Submariner 5513 \"Meter first\"","\n            \n      \n         16 000 €\n   ","\n         Rolex Submariner","\n            \n      \n         9 700 €\n   ","\n         Rolex Submariner 16610LV Kermit Y series 2003 Fat Four Mark 1...","\n            \n      \n         38 000 €\n   ","\n         Rolex Submariner Date 116610LN Boite/Papiers 2020","\n            \n      \n         13 790 €\n   ","\n         Rolex NEW 2021 some stickers  - Submariner No Date 124060","\n            \n      \n         12 490 €\n   ","\n         Rolex Submariner 14060M Full Set","\n            \n      \n         10 900 €\n   ","\n         Rolex Submariner Date 18K Gold Automatik Herrenuhr Oyster...","\n            \n      \n         27 240 €\n   ","\n         Rolex \"Submariner \"\"Hulk\"\"\"Model 116610LV Full Set 2017","\n            \n      \n         19 950 €\n   ","\n         Rolex Submariner Date 116619LB Rolex Serviced 2017","\n            \n      \n         36 500 €\n   ","\n         Rolex Submariner 5513 Feet First","\n            \n      \n         16 000 €\n   ","\n         Rolex Submariner","\n            \n      \n         12 900 €\n   ","\n         Rolex Submariner 5513 Maxi dial 1979","\n            \n      \n         19 000 €\n   ","\n         Rolex Submariner Date 16610 Boite / Papiers","\n            \n      \n         11 750 €\n   ","\n         Rolex Mint 2021 KERMIT / STARBUCKS - Submariner Date 126610 LV...","\n            \n      \n         17 500 €\n   ","\n         Rolex Submariner 41 No-Date - 124060 - Full Set - 2021","\n            \n      \n         12 900 €\n   ","\n         Rolex Submariner Date Stahl / Gold Automatik Herrenuhr Oyster...","\n            \n      \n         9 550 €\n   ","\n         Rolex Submariner (No Date) 14060M 2 Lines Full set 2005","\n            \n      \n         11 200 €\n   ","\n         Rolex Submariner Date 41mm NEW 09/2021","\n            \n      \n         14 500 €\n   ","\n         Rolex Submariner 16610LV  \"Kermit\"","\n            \n      \n         17 500 €\n   ","\n         Rolex Submariner Céramique 40mm","\n            \n      \n         12 900 €\n   ","\n         Rolex Submariner 5513 Gilt  Glossy 1966 Rolex warranty","\n            \n      \n         48 000 €\n   ","\n         Rolex Submariner 14060M Boite / Papiers","\n            \n      \n         11 450 €\n   ","\n         Rolex Submariner date - Oyster Perpetual","\n            \n      \n         18 000 €\n   ","\n         Rolex Submariner Date - 116610LN- Full Set - 2012","\n            \n      \n         12 500 €\n   ","\n         Rolex Submariner No Date Automatik Stahl Oyster Perpetual Ref....","\n            \n      \n         10 650 €\n   ","\n         Rolex Submariner  116610 \"Hulk\" 2010 SERIE G FULL SET STICKERS","\n            \n      \n         22 500 €\n   ","\n         Rolex Submariner Date Or Blanc 41mm New 07/2021","\n            \n      \n         43 900 €\n   ","\n         Rolex Submariner Date 2000 Full set","\n            \n      \n         10 800 €\n   ","\n         Rolex Submariner","\n            \n      \n         11 900 €\n   ","\n         Rolex Submariner 16610 COMEX M series full set 2008","\n            \n      \n         89 000 €\n   ","\n         Rolex Submariner Date Purple dial","\n            \n      \n         12 290 €\n   ","\n         Rolex Submariner (No Date)","\n            \n      \n         11 000 €\n   ","\n         Rolex Submariner 5508 Tropical James Bond - 1958","\n            \n      \n         26 000 €\n   ","\n         Rolex Submariner Date Kermit Automatik Stahl Herrenuhr Ref....","\n            \n      \n         16 950 €\n   ","\n         Rolex montre rolex 5513 submariner 39 mm automatique en acier...","\n            \n      \n         11 120 €\n   ","\n         Rolex Submariner \"Kermit\"1661OLV","\n            \n      \n         17 000 €\n   ","\n         Rolex Submariner Date 1996 série W Full set","\n            \n      \n         10 900 €\n   ","\n         Rolex Submariner","\n            \n      \n         11 900 €\n   ","\n         Rolex Submariner 16610 S series 1994 tritium from Hawaii","\n            \n      \n         14 900 €\n   ","\n         Rolex Submariner Date Mk1 military NATO rare country code 905...","\n            \n      \n         13 290 €\n   ","\n         Rolex Submariner Date","\n            \n      \n         15 000 €\n   ","\n         Rolex Submariner 5513","\n            \n      \n         12 500 €\n   ","\n         Rolex Submariner Date Stahl / Gold Automatik Oyster Perpetual...","\n            \n      \n         14 250 €\n   ","\n         Rolex submariner 16613t 40 mm automatique or & acier gold new...","\n            \n      \n         12 845 €\n   ","\n         Rolex Submariner Date de 1988","\n            \n      \n         8 900 €\n   ","\n         Rolex Submariner No Date 14060 4 Lignes 2009 Full Set","\n            \n      \n         12 000 €\n   ","\n         Rolex Submariner \"Kermit\"","\n            \n      \n         17 000 €\n   ","\n         Rolex Submariner","\n            \n      \n         9 600 €\n   ","\n         Rolex Submariner Date 116613 LN","\n            \n      \n         13 500 €\n   ","\n         Rolex Submariner Date Blue Dial 40mm Gold steel FULL SET","\n            \n      \n         12 980 €\n   ","\n         Rolex Submariner No Date Stickers - 124060 - Full Set - 2020","\n            \n      \n         12 500 €\n   ","\n         Rolex Submariner Stahl / Gold Automatik Herrenuhr Ref....","\n            \n      \n         16 020 €\n   ","\n         Rolex Submariner Date","\n            \n      \n         11 150 €\n   "]

为了使用 jQuery 获取数据并在 html 表中显示,我怎样才能使它变得更好?我想要一个如下所示的 JSON 输出:

[
    
        "title": "Rolex Submariner 5513 Maxi MK5 Dial",    
        "price": "16 000"
    ,
    
        "title": "Rolex Submariner Black Dial Date 41mm - 2021 - 126610LN",
        "price": "14 839"
    ,

非常感谢!!几天以来一直卡在这里......

【问题讨论】:

从外观上看,您应该从值中去除换行符。 title = title.replace(/[\n\r]/g, '');***.com/questions/25582820/… 您确定这是 JSON 编码问题,而不是原始数据的问题吗? 看起来您的数组正确分离了所有内容,即 [product1, price1, product2, price2, ...]。然后它只是一种提取文本和数字并从中创建json对象的方式。您可以使用正则表达式或类似的东西提取数据。或者只是删除\n 字符和周围的空白。 我试过title = title.replace(/[\n\r]/g, '');,我的JSON输出现在是[" Rolex Submariner"," 10 900 € ",;没有 \n 会更好,但如果在 html 中显示数据之前有类名,我的问题 我会去掉新行和双倍行距(不关闭单个空格)。 【参考方案1】:

以下是如何将 JSON 输出转换为所需格式的示例:

function jsonToPrettyJson(json) 
  const list = [];
  for (const line of json) 
    list.push(line.trim());
  
  
  const prettyJson = [];
  for (let i = 0; i < list.length; i += 2) 
    prettyJson.push( title: list[i], price: list[i + 1] );
  

  return prettyJson;


const json = ["\n         Rolex Submariner 5513 Maxi MK5 Dial","\n            \n      \n         16 000 €\n   ","\n         Rolex Submariner Black Dial Date 41mm - 2021 - 126610LN","\n            \n      \n         14 839 €\n   ","\n         Rolex Black Dial Submariner Date 41mm - 2021 Card - 126610ln","\n            \n      \n         14 839 €\n   ","\n         Rolex Submariner Meter First  MK1","\n            \n      \n         15 416 €\n   ","\n         Rolex Submariner 16610 military NATO 1994 S series","\n            \n      \n         35 000 €\n   ","\n         Rolex Submariner 126610LV Starbucks NEW 06/2021 Full set","\n            \n      \n         17 400 €\n   ","\n         Rolex 06/2021 - Submariner Date 126610 LN 99%new","\n            \n      \n         13 300 €\n   ","\n         Rolex Submariner 6536 Gilt James Bond 1956","\n            \n      \n         33 000 €\n   ","\n         Rolex Submariner Date Starbucks Automatik Edelstahl Herrenuhr...","\n            \n      \n         17 770 €\n   ","\n         Rolex Submariner","\n            \n      \n         12 500 €\n   ","\n         Rolex Submariner Date NOS avec stickers","\n            \n      \n         17 900 €\n   ","\n         Rolex Submariner 5513 \"Meter first\"","\n            \n      \n         16 000 €\n   ","\n         Rolex Submariner","\n            \n      \n         9 700 €\n   ","\n         Rolex Submariner 16610LV Kermit Y series 2003 Fat Four Mark 1...","\n            \n      \n         38 000 €\n   ","\n         Rolex Submariner Date 116610LN Boite/Papiers 2020","\n            \n      \n         13 790 €\n   ","\n         Rolex NEW 2021 some stickers  - Submariner No Date 124060","\n            \n      \n         12 490 €\n   ","\n         Rolex Submariner 14060M Full Set","\n            \n      \n         10 900 €\n   ","\n         Rolex Submariner Date 18K Gold Automatik Herrenuhr Oyster...","\n            \n      \n         27 240 €\n   ","\n         Rolex \"Submariner \"\"Hulk\"\"\"Model 116610LV Full Set 2017","\n            \n      \n         19 950 €\n   ","\n         Rolex Submariner Date 116619LB Rolex Serviced 2017","\n            \n      \n         36 500 €\n   ","\n         Rolex Submariner 5513 Feet First","\n            \n      \n         16 000 €\n   ","\n         Rolex Submariner","\n            \n      \n         12 900 €\n   ","\n         Rolex Submariner 5513 Maxi dial 1979","\n            \n      \n         19 000 €\n   ","\n         Rolex Submariner Date 16610 Boite / Papiers","\n            \n      \n         11 750 €\n   ","\n         Rolex Mint 2021 KERMIT / STARBUCKS - Submariner Date 126610 LV...","\n            \n      \n         17 500 €\n   ","\n         Rolex Submariner 41 No-Date - 124060 - Full Set - 2021","\n            \n      \n         12 900 €\n   ","\n         Rolex Submariner Date Stahl / Gold Automatik Herrenuhr Oyster...","\n            \n      \n         9 550 €\n   ","\n         Rolex Submariner (No Date) 14060M 2 Lines Full set 2005","\n            \n      \n         11 200 €\n   ","\n         Rolex Submariner Date 41mm NEW 09/2021","\n            \n      \n         14 500 €\n   ","\n         Rolex Submariner 16610LV  \"Kermit\"","\n            \n      \n         17 500 €\n   ","\n         Rolex Submariner Céramique 40mm","\n            \n      \n         12 900 €\n   ","\n         Rolex Submariner 5513 Gilt  Glossy 1966 Rolex warranty","\n            \n      \n         48 000 €\n   ","\n         Rolex Submariner 14060M Boite / Papiers","\n            \n      \n         11 450 €\n   ","\n         Rolex Submariner date - Oyster Perpetual","\n            \n      \n         18 000 €\n   ","\n         Rolex Submariner Date - 116610LN- Full Set - 2012","\n            \n      \n         12 500 €\n   ","\n         Rolex Submariner No Date Automatik Stahl Oyster Perpetual Ref....","\n            \n      \n         10 650 €\n   ","\n         Rolex Submariner  116610 \"Hulk\" 2010 SERIE G FULL SET STICKERS","\n            \n      \n         22 500 €\n   ","\n         Rolex Submariner Date Or Blanc 41mm New 07/2021","\n            \n      \n         43 900 €\n   ","\n         Rolex Submariner Date 2000 Full set","\n            \n      \n         10 800 €\n   ","\n         Rolex Submariner","\n            \n      \n         11 900 €\n   ","\n         Rolex Submariner 16610 COMEX M series full set 2008","\n            \n      \n         89 000 €\n   ","\n         Rolex Submariner Date Purple dial","\n            \n      \n         12 290 €\n   ","\n         Rolex Submariner (No Date)","\n            \n      \n         11 000 €\n   ","\n         Rolex Submariner 5508 Tropical James Bond - 1958","\n            \n      \n         26 000 €\n   ","\n         Rolex Submariner Date Kermit Automatik Stahl Herrenuhr Ref....","\n            \n      \n         16 950 €\n   ","\n         Rolex montre rolex 5513 submariner 39 mm automatique en acier...","\n            \n      \n         11 120 €\n   ","\n         Rolex Submariner \"Kermit\"1661OLV","\n            \n      \n         17 000 €\n   ","\n         Rolex Submariner Date 1996 série W Full set","\n            \n      \n         10 900 €\n   ","\n         Rolex Submariner","\n            \n      \n         11 900 €\n   ","\n         Rolex Submariner 16610 S series 1994 tritium from Hawaii","\n            \n      \n         14 900 €\n   ","\n         Rolex Submariner Date Mk1 military NATO rare country code 905...","\n            \n      \n         13 290 €\n   ","\n         Rolex Submariner Date","\n            \n      \n         15 000 €\n   ","\n         Rolex Submariner 5513","\n            \n      \n         12 500 €\n   ","\n         Rolex Submariner Date Stahl / Gold Automatik Oyster Perpetual...","\n            \n      \n         14 250 €\n   ","\n         Rolex submariner 16613t 40 mm automatique or & acier gold new...","\n            \n      \n         12 845 €\n   ","\n         Rolex Submariner Date de 1988","\n            \n      \n         8 900 €\n   ","\n         Rolex Submariner No Date 14060 4 Lignes 2009 Full Set","\n            \n      \n         12 000 €\n   ","\n         Rolex Submariner \"Kermit\"","\n            \n      \n         17 000 €\n   ","\n         Rolex Submariner","\n            \n      \n         9 600 €\n   ","\n         Rolex Submariner Date 116613 LN","\n            \n      \n         13 500 €\n   ","\n         Rolex Submariner Date Blue Dial 40mm Gold steel FULL SET","\n            \n      \n         12 980 €\n   ","\n         Rolex Submariner No Date Stickers - 124060 - Full Set - 2020","\n            \n      \n         12 500 €\n   ","\n         Rolex Submariner Stahl / Gold Automatik Herrenuhr Ref....","\n            \n      \n         16 020 €\n   ","\n         Rolex Submariner Date","\n            \n      \n         11 150 €\n   "];
console.log(jsonToPrettyJson(json));

输出:

  
    title: 'Rolex Submariner Stahl / Gold Automatik Herrenuhr Ref....',
    price: '16 020 €'
  ,
   title: 'Rolex Submariner Date', price: '11 150 €' 
...

【讨论】:

非常感谢 - 但是,我在运行时收到“(node:1636) UnhandledPromiseRejectionWarning: ReferenceError: json is not defined”错误 - 知道为什么吗? 也许我没有把你的代码放在正确的地方,是不是就在let data = JSON.stringify(Array1);上方?谢谢! @Victor jsonToPrettyJson 函数是同步的,它与承诺无关。确保在 promise 得到解决并获取数据后调用该函数。【参考方案2】:
Array1.push(title: $(e).text());
Array1.push(price: $(e).text());

你应该把键和它们的值放在对象中,然后把它放在数组中。 您将值放入 title 变量中,然后将其传递给数组 所以它替换为它们的值而不是单词:“title”等等......

【讨论】:

这行得通!非常感谢!!!当我在 HTML 表格中显示时,我得到了很多“未定义”的单元格,但我会找到一种方法来删除我猜的 :) 太棒了...主要问题是围绕制作变量而不是字符串(在组成对象时),然后将信息放入其中。感谢您发现它有用,请选择此回复作为答案

以上是关于JSON输出与Node JS一团糟的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MongoDB + Node.js + Mongoose 获取修改后的 json 输出

Node.Js 中的异步问题 - 如何执行一系列操作? [复制]

如何在node.js中将mysql查询的结果输出为json文件

Node.js json2csv 输出未正确对齐

基于 Koa平台Node.js开发的KoaHub.js的输出json到页面代码

jq处理JSON数据