NodeJS 使用javascript选择HTML电子邮件文件中脚本标记内JSON对象的值

gcuhipw9  于 2023-01-20  发布在  Node.js
关注(0)|答案(1)|浏览(128)

我需要从一个JSON对象中提取值,该对象位于HTML文件的脚本标记中。HTML实际上是一个电子邮件(.eml)文件。
我使用node的“fs”模块来读取文件,运行良好。通常,我知道如何选择HTML元素(使用document.getElementByIdinnerHTML等),以及如何通过JSON对象层次结构来选择值(使用JSON.parse和点标记法等)。但是,我不确定如何从这样的代码中选择值。

X-Account-Key: account31
X-UIDL: 00001b5f073425
X-Mozilla-Status: 0000
X-Mozilla-Status2: 00000000
X-Mozilla-Keys:
... more email header info ...
<html lang=3D"en-US"> <head> </head> <body> <div>  <script data-scope=3D"in=
boxmarkup" type=3D"application/json">{
  "api_version": "1.0",
  "publisher": {
    "api_key": "67892787u2cfedea31b225240gg3423t9",
    "name": "Google Alerts"
  },
  "cards": [ {
    "title": "Google Alert - \"search keywords\"",
    "subtitle": "Highlights from the latest email",
    "actions":
... and so on with JSON object, then closing script tag...
... email body wrapped in DIV tag ...

如果我想从这段代码中获取publisher.name或任何其他属性的值,该怎么办?
任何和所有的指针赞赏。

kmpatx3s

kmpatx3s1#

您需要执行以下步骤:
1.阅读电子邮件文件(您已经在这样做了)
1.解析电子邮件文件并从中获取HTML正文
1.解析该HTML定义的DOM
1.选择script元素
1.获取其文本内容
1.通过JSON.parse解析它
1.从结果对象访问属性
您已经读取了该文件,但为了完整起见,下面是一个通过fs/promises模块的readFile读取该文件的示例:

import fs from "fs/promises";
//...
const mailText = await fs.readFile("./test.eml");

然后我们需要解析它。正如您在注解中提到的,有一个mailparsernpm模块可以完成此任务:

import { simpleParser } from "mailparser";
// ...
const email = await simpleParser(mailText);

然后我们需要获取HTML主体并解析它。这里我使用的是jsdom

import { JSDOM } from "jsdom";
// ...
const dom = new JSDOM(email.html);

然后我们可以在dom.window.document上使用querySelector来选择script元素:

const script = dom.window.document.querySelector("script[type='application/json']");

如果有多个属性,则可能需要添加更多属性以缩小范围,例如:

const script = dom.window.document.querySelector("script[type='application/json'][data-scope='data-scope='inboxmarkup']");

一旦有了script元素,就可以通过.textContent访问其文本内容。
获得文本后,可以使用JSON.parse解析它。
一旦有了对象,obj.publisher.name应该会给出所需的值。
因此:

import fs from "fs/promises";
import { simpleParser } from "mailparser";
import { JSDOM } from "jsdom";

const mailText = await fs.readFile(/*...your email file name...*/);
const email = await simpleParser(mailText);
const dom = new JSDOM(email.html);
const script = dom.window.document.querySelector("script[type='application/json']");
const json = script.textContent;
const obj = JSON.parse(json);
const name = obj.publisher.name;
console.log(name); // "Google Alerts"

相关问题