尝试使用cheerio.js从此网站上抓取威士忌名称,image_url和说明:https://www.thewhiskyexchange.com/c/33/american-whiskey?filter=true#productlist-filter。我想将该信息转换为一个JSON对象数组,以存储在我的MongoDB中。无法显示网站的整个html,但这里是无序列表的相关基本结构的一部分:
<body>
<div class="siteWrapper">
<div class="wrapper">
<div class="products-wrapper">
<ul class="products-list">
<li>
<a>
<div class="product-content">
<div class="information">
<p class="name">
" Jack Daniel's Old No. 7"
<span>Small Bottle</span>
</p>
</div>
</div>
</a>
</li>
<li></li>
<li></li> etc. </all closing tags>
首先尝试在<p class="name">
中尝试获取威士忌名称,而不使用<span>
标签中的任何文字,我在浏览器控制台中使用了这个jQuery代码,它正是我所需要的:
$('ul.products-list > li').each(function(index) {
const nameOnly = $(this).find('a div div.information p.name').first().contents().filter(function() {
return this.nodeType == 3;
}).text();
const whiskeyObject = {name: nameOnly};
const whiskeys = JSON.stringify(whiskeyObject);
console.log(whiskeys);
})
使用cheerio在我的应用文件(whiskey-scraper.js)中尝试相同的代码:
const express = require('express');
const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');
const app = express();
const port = 8000;
request('https://www.thewhiskyexchange.com/c/33/american-whiskey?filter=true#productlist-filter', function(error, response, body) {
if(error) {
console.log("Error: " + error);
}
console.log("Status code: " + response.statusCode);
const $ = cheerio.load(body);
// console.log(body);
$('ul.products-list > li').each(function(index) {
const nameOnly = $(this).find('a div div.information p.name').first().contents().filter(function() {
return this.nodeType == 3;
}).text().trim();
const whiskeyObject = {name: nameOnly};
const whiskeys = JSON.stringify(whiskeyObject);
console.log(whiskeys);
})
});
app.listen(port);
console.log(`Stuff is working on Port ${port}!`);
当我在终端中运行node inspect whiskey-scraper.js
时,控制台会记录状态代码200,但也会记录此错误:
"Error: Can only perform operation while paused. - undefined
at _pending.(anonymous function) (node-
inspect/lib/internal/inspect_client.js:243:27)
at Client._handleChunk (node-inspect/lib/internal/inspect_client.js:213:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:191:7)
at readableAddChunk (_stream_readable.js:178:18)
at Socket.Readable.push (_stream_readable.js:136:10)
at TCP.onread (net.js:561:20)"
无法弄清楚这意味着什么或如何解决此错误。有关如何消除此错误并至少让我的console.log(whiskeys);
行正常工作的任何想法?如果我能做到这一点,我可以从那里拿走它。
当我取消注释console.log(body);
时,我会将整个网站的html记录到控制台,所以我觉得cheerio从网站上获取了我需要的信息。一旦我消除了这个错误,我就可以搞清楚image_url,描述,并将它放入我的MongoDB。
谢谢!
答案 0 :(得分:0)
找出解决方案。对于网站,您可以以网格格式或列表格式显示威士忌及其信息 - 它们是完全相同的URL。我正在查看列表格式的HTML,它使用<ul><li>
格式,但是cheerio选择导入网格格式,其中没有无序列表,只有多个嵌套<div>
。从来没有想过这个!