javascript - 单击内部 javascript 链接并使用 puppeteer 返回 url

标签 javascript puppeteer

我的目标是点击此 page 上的每个链接(称为脚注)然后返回脚注链接、文本,然后返回侧栏中出现的所有 URL。当侧边栏值出现时,我一直无法访问它们,并且在几周的失败之后,我正在寻找一些关于我做错了什么的指示(对于 javascript 和 puppeteer 来说都是非常新的)。

const puppeteer = require('puppeteer');
const url = 'https://www.churchofjesuschrist.org/study/scriptures/bofm/1-ne/11?lang=eng';
const selector = '.study-note-ref';
(async function () {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();
    await page.goto(url);
    const footnotes = await page.$$eval(selector, nodes => {
        return nodes.map(node => {
            const ref = node.href.replace('https://www.churchofjesuschrist.org', '');
            const txt = node.text;
            return {
                ref,
                txt
            };
        });
    });
    for (const a of footnotes) {
        page.click(a.ref);
        const links = await page.$$eval('.scripture-ref', nodes => {
            return nodes.map(node => {
                return node.href
            })
        })
    }
    console.log(footnotes);
    console.log(links);
    // const fs = require('fs');
    // fs.writeFile('./footnotes.json', JSON.stringify(footnotes), err => err ? console.log(err) : null);
    await browser.close();
})();

最佳答案

也许是这样的:

const puppeteer = require('puppeteer');

const url = 'https://www.churchofjesuschrist.org/study/scriptures/bofm/1-ne/11?lang=eng';
const selector = '.study-note-ref';

(async function main() {
  const browser = await puppeteer.launch({ headless: true });
  const [page] = await browser.pages();
  await page.goto(url);

  const data = {};

  for (const footnote of await page.$$(selector)) {
    const [href, text] = await page.evaluate(
      (a) => {
        a.click();
        return [a.getAttribute('href').replace('/#note', ''), a.innerText.slice(1)];
      },
      footnote
    );
    data[href] = { text };

    const header = await page.waitForXPath(`//aside/div/header/span[text()="${href} ${text}"]`);

    data[href].links = await page.evaluate(
      (span) => {
        const aside = span.closest('aside');
        return [...aside.querySelectorAll('a[href]')].map(
          a => ({ [a.innerText]: a.href })
        );
      },
      header
    );

    console.log(`Done: ${href} ${text}`);
  }
  console.log(JSON.stringify(data, null, 2));
  await browser.close();
})();

部分输出:

{
  "1a": {
    "text": "pondering",
    "links": [
      {
        "D&C 76:19": "https://www.churchofjesuschrist.org/study/scriptures/dc-testament/dc/76.19?lang=eng#p19"
      },
      {
        "TG Meditation": "https://www.churchofjesuschrist.org/study/scriptures/tg/meditation?lang=eng"
      },
      {
        "Doctrine and Covenants 76:19": "https://www.churchofjesuschrist.org/study/scriptures/dc-testament/dc/76.19?lang=eng#p19#19"
      },
      {
        "Meditation, Meditate": "https://www.churchofjesuschrist.org/study/scriptures/tg/meditation?lang=eng"
      }
    ]
  },
}

关于javascript - 单击内部 javascript 链接并使用 puppeteer 返回 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67234079/

相关文章:

javascript - jQuery 多 ID 选择器

javascript - 带有部分星星的 jQuery 星级评分系统

Javascript:将普通 Node 数组(带有指向父 Node 的指针)转换为嵌套数据结构

Node.js puppeteer - 获取所需值不起作用(td :nth-child(n)

javascript - 如何使用 jquery 一次交叉淡化一个 div

javascript - Resharper 抑制一些 Javascript 智能感知

node.js - 在 SUT 中模拟 Puppeteer 网络请求

javascript - 运行时设置 puppeteer 窗口大小而不是 headless (不是视口(viewport))

Electron - 不能在工作线程中使用 puppeteer

javascript - 如何在我当前的 chrome 中使用 puppeteer(保留我的凭据)