javascript Cheerio正在发送不完整的JSON结果

5uzkadbs  于 2022-12-21  发布在  Java
关注(0)|答案(1)|浏览(132)

我试图用cheerio破坏一个足球排名表,它是成功的,但问题是第一行和第一列是失踪和表数据是不完整的.这是我的代码如下:
'

const request = require("request-promise");
const express = require('express')
const cheerio = require("cheerio");
const app = express()
const PORT = 8888;

app.get('/td', async (req, res) => {
  const results = [];
  try {
    const result = await request.get("https://footystats.org/algeria/ligue-1");

    const $ = cheerio.load(result);

    $("#league-tables-wrapper > div > div.table-wrapper > table > tbody > tr").each((index, element) => {
     
      if (index === 0) return true;
        const tds = $(element).find("td");
        const rank = $(tds[0]).text();
        const team = $(tds[2]).text();
        const points = $(tds[10]).text();
        const tableRow = { rank, team, points };
        results.push({
            rank,
            team,
            points
        });
    });

  } catch (err) {
    console.error(err);
  }
    
   res.json(results)
});

app.listen(PORT, () => console.log(`surver running on PORT ${PORT}`))

'假设我得到了表中第一队的排名、队和分,但结果是从表中第二行的排名、队开始。这是下面结果的一个例子:
'

rank    "2"
team    "CS Constantine"
points  "29"
1   
rank    "3"
team    "MC Alger"
points  "25"
2   
rank    "4"
team    "JS Saoura"
points  "23"
3   
rank    "5"
team    "ES Sétif"
points  "22"
4   
rank    "6"
team    "USM Khenchela"
points  "20"
5   
rank    "7"
team    "USM Alger"
points  "19"

'正如您所注意到的,它开始从第二个团队(行)中抓取数据。
我试过手动获取第一组,方法是:
第一个月
并将其推送到结果中:results.push({ first_rank, rank, team points)}
但它返回一个空响应,并且完全混淆了:first "" rank "2" team "CS Constantine" points "29"
有谁能告诉我出了什么问题吗谢谢!

olqngx59

olqngx591#

选择器策略

只要tag和它的类名就足够了。

$(选择器)是找到的元素数组

示例:$(头衔)、$(级别)和$(分数)

循环使用带索引的标题数组

$(标题).每个((索引,元素)=〉{...}

在循环内部,如何通过index访问其他数组

示例:$(rank)[索引]

访问文本

它是排名的第一个子示例

$(ranks)[index].children[0].data

Team名称为红色-参见图像。

"td.team.borderRightContent > a"

Rank为蓝色

"td.position.bold > span"

Points为绿色

"td.points.bold"

此代码有效

const axios = require("axios")
const cheerio = require("cheerio")
const express = require('express')
const app = express()
const PORT = 8888;

async function getRanking() {
    try {
        const siteUrl = 'https://footystats.org/algeria/ligue-1'
        const results = [];
        const response = await axios.get(
            siteUrl,
            {
                headers: {
                    'Accept-Encoding': 'application/json',
                }
            }
        );
        const $ = cheerio.load(response.data)
        const ranks = "td.position.bold > span"
        const titles = "td.team.borderRightContent > a"
        const points = "td.points.bold"
        $(titles).each((index, element) =>{
            const rank = $(ranks)[index].children[0].data
            const team = element.children[0].data
            const point = $(points)[index].children[0].data
            results.push({
                'rank' : rank,
                'team' : team,
                'points':  point
            })
        }) 
        return Promise.resolve(results);
    } catch (error) {
        return Promise.reject(error);
    }
}

app.get('/td', async (req, res) => {
    getRanking()
        .then((results) => {
            console.log(results)
            res.json(results)
        })
        .catch(error => console.log(error));
});
    
app.listen(PORT, () => console.log(`server running on PORT ${PORT}`))

结果
URL -访问Express获得排名

http://localhost:8888/td

对于调试日志记录结果

相关问题