Значения href, которые я начинаю с "/url?q=", используя Cheerio

Я пытаюсь использовать Cheerio для очистки. Однако у меня возникла небольшая проблема. Все значения href, которые я получаю на стороне клиента, начинаются с «/url?q=". Например вот так:

'/url?q=https://www.nimh.nih.gov/health/topics/auti… pkCZkQFnoECAYQAg&usg=AOvVaw1E4L1bLVm9OdBSFMkjJftQ'

Элемент из поиска Google:

<a jsname = "UWckNb" href = "https://www.nimh.nih.gov/health/topics/autism-spectrum-disorders-asd"...

Он не содержит "/url?q = ". Откуда берется "/url?q = "?

app.get('/scrape', (req, res) => {
    request('https://www.google.com/search?q=asd', (error, response, html) => {
        if (response.statusCode == 200) {
            
            const $ = cheerio.load(html);
            const results = [];
            const links = $('a'); 
            links.each((index, link) => {
                const href = $(link).prop('href'); 
                const h3 = $(link).find('h3'); 
                
                if (h3.length > 0) {
                    const textContent = h3.text().trim();
                    results.push({ href, textContent }); 
                }
            });
        
            const responseData = {
                links: results,
                total: results.length
            };

            res.json(responseData); 
        } else {
            console.error('Unexpected status code:', response.statusCode);
            res.status(500).send('Unexpected status code.'); 
        }
    });
});

Я знаю, что могу решить это следующим образом:

 const actualUrl = decodeURIComponent(href.split('/url?q=')[1].split('&')[0]);

Но хотелось бы знать, где это "/url?q = ", что я делаю не так?

🤔 А знаете ли вы, что...
Синтаксис JavaScript схож с синтаксисом языка программирования Java, но они не связаны.


2
71
1

Ответ:

Решено

Именно так URL-адреса находятся в статическом HTML-коде, отправленном с сервера. Очевидно, некоторые JS запускаются после загрузки и обрезают hrefs, но поскольку Cheerio не запускает JS, вы мало что можете с этим поделать, кроме переключения на библиотеку автоматизации браузера, такую ​​как Puppeteer. Будьте осторожны с тем, что вы видите в инструментах разработчика — они включают в себя динамические сценарии JS.

Я бы был осторожен с decodeURIComponent(href.split('/url?q=')[1].split('&')[0]);, потому что за & могут быть параметры запроса, которые имеют значение для страницы. Я не уверен, что это за шаблон, но &sa=U, похоже, это постфикс Google.

Также:

  • Ваш селектор можно упростить для поиска только a > h3 или использовать класс, который кажется довольно стабильным (этот прошлогодний ответ, в котором используется класс, все еще действителен и более прямой).
  • Нет необходимости отправлять .length клиенту. Массивы имеют встроенную длину, поэтому они могут легко получить к ней доступ. Кэшированная длина — плохая практика, поскольку она не нужна и может легко рассинхронизироваться с фактической длиной.
  • Избегайте использования request. Он устарел, и обратные вызовы вышли из моды. Предпочитайте промисы — выборка теперь является стандартной в Node 18+, а также есть axios, который также предпочтительнее request.