【问题标题】:Extract text with cheerio用cheerio提取文本
【发布时间】:2021-09-17 06:31:44
【问题描述】:

我正在尝试编写一个脚本来从this 网站中提取电子邮件 ID 和名称。我尝试了以下 sn-p 但它不起作用。

   <!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>foo</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>

<body>
    <div>
        <strong style="color: darkgreen;">Can read this tag</strong>

        <object id="external_page" type="text/html" data="https://aleenarais.com/buddy/" width="800px" height="600px"
            style="overflow:auto;border:5px ridge blue">
            <!-- I want to read tag values from this object -->
        </object>
    </div>

    <script>
        window.addEventListener('load', function () {
            const item = [];
            $('strong[style="color: darkgreen;"]').each(function () {
                item.push($(this).text())
            })
            console.log(item)

        })
       
    </script>
</body>

</html>

有没有更好的方法来做到这一点?或者是否可以将整个页面转换为字符串并使用 RegEx 提取电子邮件?

【问题讨论】:

    标签: javascript screen-scraping cheerio


    【解决方案1】:

    网页中的电子邮件和名称正在 iframe 中呈现。 iframe 的来源是外部来源。为了让您提取信息,您需要使用无头浏览器来执行此操作。

    我建议使用 Node.JS 和 Puppeteer (https://www.npmjs.com/package/puppeteer)

    const puppeteer = require("puppeteer");
    (async() => {
      const url = "https://aleenarais.com/buddy/";
      const browser = await puppeteer.launch();
      const page = await browser.newPage();
      await page.goto(url, {
        waitUntil: "networkidle0"
      });
      var frames = await page.frames();
      var myframe = frames.find(
        (f) => f.url().indexOf("https://feedium.app/fetchh.php") > -1
      );
      const textFeed = await myframe.$$eval("strong", (sElements) =>
        sElements.map((el) => el.textContent)
      );
      console.log(textFeed.splice(1)); //Array contains both name and email
      await browser.close();
    })();

    Puppeteer 加载页面的方式类似于用户加载页面的方式。它一直等到所有网络调用都完成(请参阅网络 idle0),然后尝试查找具有 url (fetchh.php) 的 iframe。如果您观察到,姓名和电子邮件出现在强标签中,它们是唯一可用的强标签。因此,我们正在提取强标签,删除计数,只剩下姓名和电子邮件。

    输出: [ 'JJ', 'j*j@gmail.com' ] //我刚刚掩盖了这些值,但程序给出了实际值

    运行脚本的步骤:

    1. 安装 Node.Js (https://nodejs.org/en/download/)
    2. 使用 (npm i puppeteer) 安装 puppeteer
    3. 复制脚本并将其放入文件(demo.js)中
    4. 在终端中,导航到 demo.js 所在的目录 呈现然后运行 ​​node demo.js

    您应该会看到输出。

    【讨论】:

      【解决方案2】:

      试试这个:

      window.addEventListener('load', function () {
                  let item = [];
                  $('strong[style*="color: darkgreen;"]').each(function (index, item) {
                      item.push($(this).text())
                  })
                  console.log(item)
      }
      

      【讨论】:

      • 适用于外部标签,但这不是我想要的。 (请检查编辑)
      猜你喜欢
      • 2023-03-18
      • 2015-10-11
      • 1970-01-01
      • 2023-03-31
      • 2023-02-16
      • 2023-02-06
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      相关资源
      最近更新 更多