cheerio 相关问题

专为服务器设计的核心jQuery的快速,灵活和精益实现。 https://github.com/cheeriojs/cheerio

在实时服务器上使用 axios.get 时出现 404 响应

我正在学习使用 JavaScript 进行网页抓取,在尝试将一个简单的网页登录到控制台时,我收到了一个奇怪的 404 错误: 无法加载资源:服务器响应状态为 4...

回答 1 投票 0

在实时服务器上使用 axios.get 时出现 404 响应

我正在学习使用 JavaScript 进行网页抓取,在尝试将一个简单的网页登录到控制台时,我收到了一个奇怪的 404 错误: 无法加载资源:服务器响应状态为 4...

回答 1 投票 0

href 值我使用 Cheerio

我正在尝试使用cheerio进行抓取。不过我遇到了一个小问题。我在客户端获得的所有 href 值都以“/url?q=”开头。例如这样: '/url?q=https://www.nimh.ni...

回答 1 投票 0

使用node.js从div中检索文本

我目前正在尝试编写一个抓取工具,它将使用node.js从Facebook帖子内的div中获取所有“p”标签 页面上的每个帖子都位于 div 中,并且都具有此类别...

回答 2 投票 0

无法从 Facebook 广告的元标记中抓取图像 url - Axios Cheerio

感谢您的光临。 我正在尝试使用 Axios 和 Cheerio 从 Facebook 广告 URL 中抓取 og:image 元标记的值。我有一个函数可以在 dep 的上下文中调用...

回答 1 投票 0

使用cheerio从表中抓取所有行

我正在运行以下代码来抓取数据。但是,该代码仅抓取第一个元素。 const Cheerio = require('cheerio') const jsonframe = require('jsonframe-cheerio') const 得 = 要求('...

回答 2 投票 0

用cheerio刮取所有元素

我正在运行以下代码来抓取数据。但是,该代码仅抓取第一个元素。 const Cheerio = require('cheerio') const jsonframe = require('jsonframe-cheerio') const 得 = 要求('...

回答 2 投票 0

Cheerio 获取类的多个匹配项中的第一个元素

我有这个 HTML: ... 我有这个 HTML: <div class="flex__col--md-2 flex__col--xs-4 color-box color-box--orange color-box--no-pad text-center"> <p class="u-text-white"> <strong> 208,00 Euro </strong> </p> </div> 第二部分如下所示: <div class="flex__col--md-2 flex__col--xs-4 color-box color-box--orange color-box--no-pad text-center"> <p class="u-text-white"> <strong>1.978,00 Euro</strong> </p> </div> 类“flex__col--md-2 flex__col--xs-4 col...”和类“u-text-white”可以在html中找到两次。我想从第一个条目“208,00 Euro”中选择值。 var parsedHTML = $.load(body); console.log("the value"); 有人可以帮我使用cheerio 将 208 欧元存入控制台日志吗? 您应该能够像这样访问数据。 var firstEl = parsedHTML .find('.flex__col--md-2.flex__col--xs-4') .first() .find('.u-text-white'); var data = firstEl.find('strong').text(); 改进现有答案,您可以使用自然的 CSS 链接,而无需多次 .find() 调用: const cheerio = require("cheerio"); // ^1.0.0-rc.12 const html = `<div class="flex__col--md-2 flex__col--xs-4 color-box color-box--orange color-box--no-pad text-center"> <p class="u-text-white"> <strong>208,00 Euro</strong> </p> </div> <div class="flex__col--md-2 flex__col--xs-4 color-box color-box--orange color-box--no-pad text-center"> <p class="u-text-white"> <strong>1.978,00 Euro</strong> </p> </div>`; const $ = cheerio.load(html); const text = $(".flex__col--md-2.flex__col--xs-4 p.u-text-white") .first() .text() .trim(); console.log(text); // => 208,00 Euro 这里答案的关键部分是.first()。 .last() 和 .nth(0) 是 .first() 上有用的变体函数。 其他选项包括: const text = $(".flex__col--md-2.flex__col--xs-4 p.u-text-white:nth(0)") .text() .trim(); 和 const text = $(".flex__col--md-2.flex__col--xs-4 p.u-text-white:first") .text() .trim();

回答 2 投票 0

从 dom 获取课程 -->cheerio

我有这个 HTML: ... 我有这个 HTML: <div class="flex__col--md-2 flex__col--xs-4 color-box color-box--orange color-box--no-pad text-center"> <p class="u-text-white"> <strong> 208,00 Euro </strong> </p> </div> 第二部分如下所示: <div class="flex__col--md-2 flex__col--xs-4 color-box color-box--orange color-box--no-pad text-center"> <p class="u-text-white"> <strong>1.978,00 Euro</strong> </p> </div> 类“flex__col--md-2 flex__col--xs-4 col...”和类“u-text-white”可以在html中找到两次。我想从第一个条目“208,00 Euro”中选择值。 var parsedHTML = $.load(body); console.log("the value"); 有人可以帮我使用cheerio 将 208 欧元存入控制台日志吗? 您应该能够像这样访问数据。 var firstEl = parsedHTML .find('.flex__col--md-2.flex__col--xs-4') .first() .find('.u-text-white'); var data = firstEl.find('strong').text(); 改进现有答案,您可以使用自然 CSS 链接,而无需多次 .find() 调用: const cheerio = require("cheerio"); // ^1.0.0-rc.12 const html = `<div class="flex__col--md-2 flex__col--xs-4 color-box color-box--orange color-box--no-pad text-center"> <p class="u-text-white"> <strong>208,00 Euro</strong> </p> </div> <div class="flex__col--md-2 flex__col--xs-4 color-box color-box--orange color-box--no-pad text-center"> <p class="u-text-white"> <strong>1.978,00 Euro</strong> </p> </div>`; const $ = cheerio.load(html); const text = $(".flex__col--md-2.flex__col--xs-4 p.u-text-white") .first() .text() .trim(); console.log(text); // => 208,00 Euro 这里答案的关键部分是.first()。

回答 2 投票 0

使用 Fetch 和 Cheerio 清空结果抓取站点

出于兴趣,我决定为自己从该网站收集数据(名称、每晚价格、评级),但遇到了误解。我没有得到任何输出。我在其他 Libra 上重写了...

回答 2 投票 0

你如何阅读cheerio的回复?

运行以下命令后,我在弄清楚如何阅读cheerio的响应时遇到了一些困难: const axios = require('axios') const Cheerio = require('cheerio') axios.get('https://bulbape...

回答 1 投票 0

Puppeteer 在本地工作会罚款,但部署后不会?

我的浏览器是这样启动的: 异步函数 startBrowser() { const browser = 等待 puppeteer.launch({ 参数:[ '--无沙箱', '--禁用 GPU', '--禁用-dev-shm-u...

回答 1 投票 0

如何使用 Cheerio google 应用脚本从网站 github.com 获取表格

我正在尝试使用 Google 应用程序脚本中的 Cheerio lib 从该网站获取表格。我在这个答案下面放了一些代码,但在 console.log() 中只得到 [] 有我的代码 函数测试2() { 常量...

回答 1 投票 0

如何修复 Node/Cheerio 中的“$(...).click 不是函数”

我正在用node.js编写一个应用程序,它将导航到一个网站,单击网站上的按钮,然后从网站中提取某些数据。一切都很顺利,除了......

回答 3 投票 0

Cherrio JS 返回父 div 的所有图像 SRC

考虑以下 HTML: 考虑以下 HTML: <div aria-roledescription="carousel" data-disliderguid="slider772" class="di-slider slider772-slider gmus-1800x760-slider"> <div class="swiper-container"> <div class="swiper-wrapper"> <div class="di-slide swiper-slide" data-guid="slide2221" data-screen="desktop" data-title="995_2024_All_Hummer_Evergreen_2024_DWC" data-id="2221" data-filtervalue="" data-swiper-autoplay="3000"> <div class="di-slider-disclaimer"> <button class="di-slider-disclaimer-toggle" aria-expanded="false"> <span class="inactive-label">Important Information</span> <span class="active-label">Hide Information</span> </button> <div class="di-slider-disclaimer-container"> <div class="di-slider-disclaimer-contents"> Preproduction and simulated models shown throughout. Actual production model may vary. HUMMER EV is available from a GMC EV dealer. </div> </div> </div> <a class="di-slider-link" aria-hidden="true" href="/new-vehicles/?_dFR%5Byear%5D%5B0%5D=2024&_dFR%5Bmake%5D%5B0%5D=GMC&_dFR%5Bmodel%5D%5B0%5D=HUMMER+EV&_dFR%5Bmodel%5D%5B1%5D=HUMMER+EV+SUV&_dFR%5Bmodel%5D%5B2%5D=HUMMER+EV+Pickup" title="" tabindex="-1" > <picture class="slide-image"> <source media="(max-width: 767px)" srcset="https://gtmassets.dealerinspire.com/9061-995_2024_All_Hummer_Evergreen_2024_DWC_600x400.jpg"> <source media="(min-width: 768px)" srcset="https://gtmassets.dealerinspire.com/9061-995_2024_All_Hummer_Evergreen_2024_DWC_1800x760.jpg"> <img src="https://gtmassets.dealerinspire.com/9061-995_2024_All_Hummer_Evergreen_2024_DWC_1800x760.jpg" alt="GMC HUMMER EV PICKUP AND SUV" style="" width="1800" height="760"> </picture> </a> </div> <div class="di-slide swiper-slide" data-guid="slide950" data-screen="desktop" data-title="Generic" data-id="950" data-filtervalue="" > <picture class="slide-image"> <source media="(max-width: 767px)" srcset="https://di-uploads-development.dealerinspire.com/robertsonsgmc-winback0123/uploads/2023/03/Group-of-2023-GMC-Terrain-SUVs-parked-on-beach_mobile.jpg"> <source media="(min-width: 768px)" srcset="https://di-uploads-development.dealerinspire.com/robertsonsgmc-winback0123/uploads/2023/03/Group-of-2023-GMC-Terrain-SUVs-parked-on-beach-1800x760.jpg"> <img src="https://di-uploads-development.dealerinspire.com/robertsonsgmc-winback0123/uploads/2023/03/Group-of-2023-GMC-Terrain-SUVs-parked-on-beach-1800x760.jpg" alt="Group of 2023 GMC Terrain SUVs parked on beach" style="visibility:hidden" width="1800" height="760"> </picture> 我尝试通过 ScrapeNinja 使用 Cherrio 返回 Div 类 di-slider 子级的所有图像的 SRC,如 HTML 片段的第一行所示。所有图像都是 HTML 图片对象,并且都具有类似的 div 类。但是,我想要返回的唯一链接是值。 当我尝试在他们的沙箱上运行以下代码时:https://scrapeninja.net/cheerio-sandbox/basic,我收到错误“错误:预期名称,找到://gtmassets.dealerinspire.com/9061 -995_2024_All_Hummer_Evergreen_2024_DWC_1800x760.jpg 第 19 行 这是我收到的错误: // define function which accepts body and cheerio as args function extract(input, cheerio) { // return object with extracted values let $ = cheerio.load(input); var listItems = $(".di-slider"); listItems.each(function(idx, picture) { let image= $(picture).find('img').attr('src'); return { source: $(image) }; }); } 我承认,我对 JS 并不是最擅长的,我已经很多年没有使用 jQuery 了,这是我第一次尝试使用 Cheerio 或 scrapeninja。 我已经查看了文档https://pixeljets.com/blog/cheerio-sandbox-cheatsheet/#iterate-over-children-and-return-them-as-an-array-of-objects,并且我构建了我的功能是如何通过cheerio获取图像url? 几个问题: .forEach/.each 不返回值。您从其中返回的任何内容都将被忽略。另一方面,.map 使用回调返回的所有值分配一个数组。这是最适合这项工作的功能。您还可以将每个项目推送到数组变量上,但这就是 map 的抽象设计目的。 您不会从 extract() 退回任何东西。 崩溃的主要原因是您将字符串放入 Cheerio 对象中:$("https://gtmassets.dealerinspire.com/9061-995_2024_All_Hummer_Evergreen_2024_DWC_1800x760.jpg")。删除这里的$()。 工作代码: function extract(input, cheerio) { const $ = cheerio.load(input); return [...$(".di-slider")].map(e => ({ source: $(e).find("img").attr("src") })); }

回答 1 投票 0

使用 Cheerio

我想使用 Cheerio 从 HTML 文档中提取信息。 我无法更改 HTML 文件的内容,因为它具有外部来源。 我想要提取的元素有一个带有 d 的类名...

回答 1 投票 0

使用 Puppeteer 和 jQuery 将所有无序列表项抓取到数组中

我正在使用 puppeteer 与 jQuery 和 NodeJS 来尝试从网页获取列表项: 我正在使用 puppeteer 与 jQuery 和 NodeJS 来尝试从网页获取列表项: <table> <td class="hr"> <ul class="people"> <li class = "person">Richard</li> <li class = "person">Linus</li> <li class = "person">Brian</li> <li class = "team_lead">Charles</li> </ul> </td> <td class="manufacturing"> <ul class="people"> <li class = "person">Alan</ul> <li class = "person">Margret</li> <li class = "person">Ken</li> <li class = "person">Edsger</li> <li class = "team_lead">Dennis</li> </ul> </td> <td class="design"> <ul class="people"> <li class = "person">Bill</li> <li class = "person">Ada</li> <li class = "person">Steve</li> <li class = "person">Ken</li> <li class = "team_lead">Dennis</li> </ul> </td> </table> 并使用nodeJS代码: const puppeteer = require("puppeteer"); const cheerio = require("cheerio"); async function main(){ const browser = await puppeteer.launch({headless : false, defaultViewport: {width: 1920, height: 1080}}); const page = await browser.newPage(); await page.goto("${url}"); const htmlContent = await page.content(); const $ = cheerio.load(htmlContent); let peopleList = []; $(`table td .people`).each(function(i, li){ peopleList.push(li.text()); }); console.log(`people: ${peopleList}`); } main(); 我从另一个 stackoverflow 答案中得到了用于解析列表的代码: 如何使用 jQuery 并使用 Udemy 教程在数组中存储列表项,并尝试对其进行相应的编辑。 我希望将每个名称存储在二维数组中,例如: peopleList = [[Richard, Linus, Brian, Charles], [Alan, Margret, Edsger, Dennis], [Bill, Ada, Steve, Ken, Dennis]]; 但是我得到了一个字符串: RichardLinusBrianCharlesAlanMargretEdsgerDenisBillAdSteveKenDennis,RichardLinusBrianCharlesAlanMargretEdsgerDenisBillAdSteveKenDennis,... (对每个 ul 元素重复),当我尝试更深入并包含 li 标签时,我只是得到一个空字符串。 有什么方法可以按照我想要的方式保存吗? 我使用的是私人网站,因此已删除该网址并将人员更改为计算机科学家。有什么方法可以将 Puppeteer 指向本地运行的站点,例如:localhost/index.html? 无需将 Cheerio 与 Puppeteer 一起使用。 Puppeteer 已经可以使用实时页面,因此将页面快照为字符串,然后将其转储到单独的库中通常没有意义。这是低效的,并且当快照过时时会导致令人困惑的错误。 相反,请使用 page.$$eval(yourSelector, browserCallback) 来完成这项工作: const puppeteer = require("puppeteer"); // ^21.6.0 const html = `<HTML pasted from your question>`; let browser; (async () => { browser = await puppeteer.launch({headless: "new"}); const [page] = await browser.pages(); await page.setContent(html); const sel = "table td .people .person"; await page.waitForSelector(sel); const people = await page.$$eval( sel, els => els.map(el => el.textContent.trim()) ); console.log(people); })() .catch(err => console.error(err)) .finally(() => browser?.close()); 输出: [ 'Richard', 'Linus', 'Brian', 'Alan', 'Bill', 'Ada', 'Steve', 'Ken' ] 上面使用选择器 table td .people .person 解决了连接字符串问题,从技术上讲,这也适用于 Cheerio 方法。 如果你想保持类别不同,你可以使用嵌套查询: // ... const people = await page.$$eval("table td", els => els.map(el => ({ category: el.className, people: [...el.querySelectorAll(".person")].map(e => e.textContent.trim() ), })) ); // ... 给出: [ { category: 'hr', people: [ 'Richard', 'Linus', 'Brian' ] }, { category: 'manufacturing', people: [ 'Alan', 'Margret', 'Ken', 'Edsger' ] }, { category: 'design', people: [ 'Bill', 'Ada', 'Steve', 'Ken' ] } ] 总而言之,如果您正在使用的页面具有您想要的静态数据,那么使用 fetch 和 Cheerio 可能是有意义的。但我假设您正在使用 SPA 或网站,需要一些交互才能到达抓取点,或者有其他一些使用 Puppeteer 的良好动机。 另外,如果您最终坚持使用 Puppeteer 但更喜欢使用 jQuery,您可以添加它,或者如果页面恰好已经包含 jQuery,则使用它。然后,您将在浏览器上下文中运行的 $ 系列回调中访问 evaluate。在大多数情况下,这比使用 Cheerio 更有意义,因为您正在利用 Puppeteer 的实时页面功能,并且不会遇到陈旧数据问题。 为了回答您的其他问题,出于演示和可重复性的目的,我使用 setContent 如上所示,但您可以 运行服务器 并导航到本地主机上的页面。只需确保包含端口即可。

回答 1 投票 0

使用 pupeteer 和 jquery 将所有无序列表项抓取到数组中

我正在使用 puppeteer 与 JQuery 和 nodeJS 来尝试从网页获取列表项: 我正在使用 puppeteer 与 JQuery 和 nodeJS 来尝试从网页获取列表项: <table> <td class="hr"> <ul class="people"> <li class = "person">Richard</li> <li class = "person">Linus</li> <li class = "person">Brian</li> <li class = "team_lead">Charles</li> </ul> </td> <td class="manufacturing"> <ul class="people"> <li class = "person">Alan</ul> <li class = "person">Margret</li> <li class = "person">Ken</li> <li class = "person">Edsger</li> <li class = "team_lead">Dennis</li> </ul> </td> <td class="design"> <ul class="people"> <li class = "person">Bill</li> <li class = "person">Ada</li> <li class = "person">Steve</li> <li class = "person">Ken</li> <li class = "team_lead">Dennis</li> </ul> </td> </table> 并使用nodeJS代码: const puppeteer = require("puppeteer"); const cheerio = require("cheerio"); async function main(){ const browser = await puppeteer.launch({headless : false, defaultViewport: {width: 1920, height: 1080}}); const page = await browser.newPage(); await page.goto("${url}"); const htmlContent = await page.content(); const $ = cheerio.load(htmlContent); let peopleList = []; $(`table td .people`).each(function(i, li){ peopleList.push(li.text()); }); console.log(`people: ${peopleList}`); } main(); 我从另一个 stackoverflow 答案中得到了用于解析列表的代码: 如何使用 jQuery 在数组中存储列表项并使用 Udemy 教程,并尝试对其进行相应的编辑。 我希望将每个名称存储在二维数组中,例如: peopleList = [[理查德、莱纳斯、布莱恩、查尔斯]、[艾伦、玛格丽特、艾兹格、丹尼斯]、[比尔、艾达、史蒂夫、肯、丹尼斯]]; 但是我得到一个字符串:RichardLinusBrianCharlesAlanMargretEdsgerDenisBillAdSteveKenDennis,RichardLinusBrianCharlesAlanMargretEdsgerDenisBillAdSteveKenDennis,... (对每个 ul 元素重复),当我尝试更深入并包含 li 标签时,我只是得到一个空字符串。 有什么方法可以按照我想要的方式保存吗? 我使用的是私人网站,因此已删除该网址并将人员更改为计算机科学家。有什么方法可以将 puppeteer 指向本地运行的站点,例如:localhost/index.html? 无需将 Cheerio 与 Puppeteer 一起使用。 Puppeteer 已经可以使用实时页面,因此将页面快照为字符串,然后将其转储到单独的库中通常没有意义。 相反,请使用 page.$$eval(yourSelector, browserCallback) 来完成这项工作: const puppeteer = require("puppeteer"); // ^21.6.0 const html = `<HTML pasted from your question>`; let browser; (async () => { browser = await puppeteer.launch({headless: "new"}); const [page] = await browser.pages(); await page.setContent(html); const people = await page.$$eval( "table td .people .person", els => els.map(el => el.textContent.trim()) ); console.log(people); })() .catch(err => console.error(err)) .finally(() => browser?.close()); 输出: [ 'Richard', 'Linus', 'Brian', 'Alan', 'Bill', 'Ada', 'Steve', 'Ken' ] 如果你想保持类别不同,你可以使用嵌套查询: // ... const people = await page.$$eval("table td", els => els.map(el => ({ category: el.className, people: [...el.querySelectorAll(".person")].map(e => e.textContent.trim() ), })) ); // ... 给出: [ { category: 'hr', people: [ 'Richard', 'Linus', 'Brian' ] }, { category: 'manufacturing', people: [ 'Alan', 'Margret', 'Ken', 'Edsger' ] }, { category: 'design', people: [ 'Bill', 'Ada', 'Steve', 'Ken' ] } ] 为了回答您的其他问题,出于演示目的,我使用 setContent,如上所示,但您可以 运行服务器 并导航到本地主机上的页面。只需确保包含端口即可。

回答 1 投票 0

抓取谷歌词典

我正在尝试抓取 Google 词典并创建一个非官方 API。我尝试使用 Node.js 的 Cheerio 和 request 包来实现此功能。 这是我的代码: var Cheerio = 要求(“

回答 3 投票 0

在@types/enzyme/index.d.t 中找不到名称“Cheerio”

尝试运行我的 Node 应用程序时出现此错误: C:/Me/MyApp/node_modules/@types/enzyme/index.d.ts (351,15):找不到名称“Cheerio”。 我发现一篇文章建议我应该......

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.