Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Puppeter-从具有特定类名的div中检索链接_Javascript_Node.js_Puppeteer - Fatal编程技术网

Javascript Puppeter-从具有特定类名的div中检索链接

Javascript Puppeter-从具有特定类名的div中检索链接,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,有class=“xj7”的div 下面是一个a=href链接 如何访问链接的值?更棘手的是,有许多元素具有相同的类名——因此理想情况下,我希望循环遍历它们 另一个障碍是这种联系是相对的。这意味着它没有指定域名。是这样的: <div class="xj7"> <a href="/tst/gfhe7sje"> 试试这个,告诉我它是否有效 async function run(){ await page.goto('<url_here>');

有class=“xj7”的div 下面是一个a=href链接

如何访问链接的值?更棘手的是,有许多元素具有相同的类名——因此理想情况下,我希望循环遍历它们

另一个障碍是这种联系是相对的。这意味着它没有指定域名。是这样的:

<div class="xj7">
    <a href="/tst/gfhe7sje">

试试这个,告诉我它是否有效

async function run(){
    await page.goto('<url_here>');
    let div_selector= "div.xj7.Kwh5n"; 

    let list_length    = await page.evaluate((sel) => {
            let elements = Array.from(document.querySelectorAll(sel));
            return elements.length;
    }, div_selector);

    for(let i=0; i< list_length; i++){
        var href = await page.evaluate((l, sel) => {
                    let elements= Array.from(document.querySelectorAll(sel));
                    let anchor  = elements[l].getElementsByTagName('a')[0];
                    if(anchor){
                        return anchor.href;
                    }else{
                        return '';
                    }
                }, i, div_selector);
        console.log('--------> ', href)
    }
    await browser.close();
}
run();
异步函数运行(){
等待第页转到(“”);
让div_selector=“div.xj7.Kwh5n”;
让列表长度=等待页面。评估((sel)=>{
让elements=Array.from(document.querySelectorAll(sel));
返回元素长度;
},分区选择器);
for(设i=0;i{
让elements=Array.from(document.querySelectorAll(sel));
让anchor=elements[l].getElementsByTagName('a')[0];
如果(锚定){
return anchor.href;
}否则{
返回“”;
}
},i,div_选择器);
console.log('----------->',href)
}
等待浏览器关闭();
}
run();

试试这个,告诉我它是否有效

async function run(){
    await page.goto('<url_here>');
    let div_selector= "div.xj7.Kwh5n"; 

    let list_length    = await page.evaluate((sel) => {
            let elements = Array.from(document.querySelectorAll(sel));
            return elements.length;
    }, div_selector);

    for(let i=0; i< list_length; i++){
        var href = await page.evaluate((l, sel) => {
                    let elements= Array.from(document.querySelectorAll(sel));
                    let anchor  = elements[l].getElementsByTagName('a')[0];
                    if(anchor){
                        return anchor.href;
                    }else{
                        return '';
                    }
                }, i, div_selector);
        console.log('--------> ', href)
    }
    await browser.close();
}
run();
异步函数运行(){
等待第页转到(“”);
让div_selector=“div.xj7.Kwh5n”;
让列表长度=等待页面。评估((sel)=>{
让elements=Array.from(document.querySelectorAll(sel));
返回元素长度;
},分区选择器);
for(设i=0;i{
让elements=Array.from(document.querySelectorAll(sel));
让anchor=elements[l].getElementsByTagName('a')[0];
如果(锚定){
return anchor.href;
}否则{
返回“”;
}
},i,div_选择器);
console.log('----------->',href)
}
等待浏览器关闭();
}
run();
您可以执行以下操作:

const crawl = async (url) => {
  try {
    console.log(`Crawling ${url}`)
    const browser = await puppeteer.launch()
    const page = await browser.newPage()
    await page.goto(url)

    const selector = '.xj7 > a'
    await page.waitForSelector(selector)
    const links = await page.$$eval(selector, am => am.filter(e => e.href).map(e => e.href))

    console.log(links)

    await browser.close()
  } catch (err) {
    console.log(err)
  }
}

crawl('https://example.com')
您可以这样做:

const crawl = async (url) => {
  try {
    console.log(`Crawling ${url}`)
    const browser = await puppeteer.launch()
    const page = await browser.newPage()
    await page.goto(url)

    const selector = '.xj7 > a'
    await page.waitForSelector(selector)
    const links = await page.$$eval(selector, am => am.filter(e => e.href).map(e => e.href))

    console.log(links)

    await browser.close()
  } catch (err) {
    console.log(err)
  }
}

crawl('https://example.com')

非常感谢你抽出时间来帮助我。但是document.querySelector(sel)没有变量sel作为参数传递。另外,我刚刚注意到我的类名是“xj7 Kwh5n”,那么这将如何更改div_选择器变量?不,如果您查看
页面。评估
函数,在函数末尾,我们传递了变量
div_选择器
,该变量在variable
sel
中捕获/接收。基本上,这就是我们将变量传递到page.evaluate的方式。另外,新的选择器将变成“div.xj7.Kwh5n”。我得到了这个错误“UnhandledPromisejectionWarning:TypeError:无法读取未定义的属性'length'”@user1584421我已经更新了我的答案。很抱歉在没有testin:)的情况下擅自发布答案。早期代码中的问题是我们从page.evaluate()返回DOM内容,这是不可能的。但是我们可以返回值,因此现在我们首先返回长度,然后在page.evaluate中执行
href
提取并返回链接。我已经测试了这段代码,应该可以运行了,我的朋友,这段代码运行得非常完美。。。我无法形容我对你的感激之情。感谢您花时间编写代码来帮助我。你的举止也无可挑剔。我真的希望将来能听到你更多的消息。非常感谢。非常感谢你抽出时间来帮助我。但是document.querySelector(sel)没有变量sel作为参数传递。另外,我刚刚注意到我的类名是“xj7 Kwh5n”,那么这将如何更改div_选择器变量?不,如果您查看
页面。评估
函数,在函数末尾,我们传递了变量
div_选择器
,该变量在variable
sel
中捕获/接收。基本上,这就是我们将变量传递到page.evaluate的方式。另外,新的选择器将变成“div.xj7.Kwh5n”。我得到了这个错误“UnhandledPromisejectionWarning:TypeError:无法读取未定义的属性'length'”@user1584421我已经更新了我的答案。很抱歉在没有testin:)的情况下擅自发布答案。早期代码中的问题是我们从page.evaluate()返回DOM内容,这是不可能的。但是我们可以返回值,因此现在我们首先返回长度,然后在page.evaluate中执行
href
提取并返回链接。我已经测试了这段代码,应该可以运行了,我的朋友,这段代码运行得非常完美。。。我无法形容我对你的感激之情。感谢您花时间编写代码来帮助我。你的举止也无可挑剔。我真的希望将来能听到你更多的消息。非常感谢。