我想用啦啦队来刮胡子.但是我有一个小问题.我在客户端得到的所有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="在哪里,我做错了什么?

推荐答案

这就是从服务器发送的静态HTML中URL的情况.显然,有些JS在加载后运行并修剪href,但是由于Cheerio不运行JS,所以除了切换到像Puppeteer这样的浏览器自动化库之外,你也无能为力.要小心你在devtools中看到的东西--它包含了动态JS脚本.

我会谨慎使用decodeURIComponent(href.split('/url?q=')[1].split('&')[0]);,因为&后面可能有查询参数对页面很重要.我不知道是什么模式,但&sa=U似乎是谷歌后缀.

所以:

  • 你的 Select 器可以简化为只搜索a > h3,或者使用类,这看起来相当稳定(go 年使用类的this answer仍然有效,更直接).
  • 没有必要把.length块钱寄给客户.数组有内置的长度,所以它们可以自然地访问它.缓存长度是不好的做法,因为它是不必要的,而且很容易与实际长度不同步.
  • 避免使用request.它已经过时了,回调已经过时了.Prefer promises--fetch现在在Node 18+中是标准的,而且还有axios,这也比request更好.

Javascript相关问答推荐

如何访问react路由v6加载器函数中的查询参数/搜索参数

如何获取转换字节的所有8位?

如何在表格上拥有水平滚动条,在正文页面上拥有垂直滚动条,同时还对html表格的标题使用位置粘性?

vscode扩展-webView Panel按钮不起任何作用

调用removeEvents不起作用

类型自定义lazy Promise. all

Redux查询多个数据库Api reducerPath&

D3 Scale在v6中工作,但在v7中不工作

在这种情况下,如何 for each 元素添加id?

在grafana情节,避免冲突的情节和传说

在open shadow—root中匹配时,使用jQuery删除一个封闭的div类

本地库中的chartjs-4.4.2和chartjs-plugin-注解

OpenAI转录API错误请求

Django导入问题,无法导入我的应用程序,但我已在设置中安装了它

JavaScript&;Reaction-如何避免在不使用字典/对象的情况下出现地狱?

如何在尚未创建的鼠标悬停事件上访问和着色div?

我在哪里添加过滤器值到这个函数?

如何将字符串拆分成单词并跟踪每个单词的索引(在原始字符串中)?

在点击链接后重定向至url之前暂停

如何动态呈现适合未知屏幕大小的最大数量的表行?苗条的