在cheerio webscraping中使用正则表达式匹配时出现“TypeError:无法读取null的属性”

问题描述 投票:0回答:1
javascript node.js regex cheerio
1个回答
1
投票

这些 CSS 选择器看起来有点动态,所以这里有一个使用普通标签并下拉 32 个结果的方法:

const axios = require("axios"); // 1.4.0
const cheerio = require("cheerio"); // 1.0.0-rc.12

const url = "<Your URL>";

axios
  .get(url)
  .then(({data: html}) => {
    const $ = cheerio.load(html);
    const data = [...$("article dd > p")]
      .map(e => $(e).text().match(/(.*?) *\((.*)\)/))
      .filter(Boolean)
      .map(e => e.slice(1, 3));
    console.log(data);
  })
  .catch(err => console.error(err));

如果您想要获取的数据不仅仅是这一字段:

axios
  .get(url)
  .then(({data: html}) => {
    const $ = cheerio.load(html);
    const data = [...$("main > div > article")]
      .map(e => ({
        something: $(e).find("dd > p")
          .text()
          .match(/(.*?) *\((.*)\)/)
          .slice(1, 3),
        price: $(e).find("h3").text().trim(),
        model: $(e).find("h1").text().trim(),
        mileage: $(e).find('[data-parameter="mileage"]')
          .text().trim(),
        fuelType: $(e).find('[data-parameter="fuel_type"]')
          .text().trim(),
      }));
    console.log(data);
  })
  .catch(err => console.error(err));

需要明确的是,如果您认为 CSS 选择器稳定,您可以使用它们——基本策略基本相同。首先选择容器,即 <article>

,然后深入到子项中以收集该项目的数据。

我使用了

something

,因为我不知道该字段在英语中的含义。

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