我需要打开非常简单的网站并扫描json对象,即
myJSONObject:["el1","el2"]
。网站上只有一个HTML <pre>
标签,其中包含100行文本。没有其他的。
我打算扫描页面上的 myJSONObject:,然后返回[“ el1”,“ el2”]。
我使用了以下内容,由于找到了“ myJSONObject:”,因此返回true,但是我无法返回任何文本。
const found = await page.evaluate(() => window.find("myJSONObject:"));
是否可以使用正则表达式或其他方法来找到所需的文本并将其返回?这是可能吗?
我是puppeteer的新手,所以我不确定它的功能。我感谢任何反馈。
答案 0 :(得分:0)
您已经找到合适的功能(puppeteer.evaluate)来完成这项工作。有了它,您可以从浏览器/页面上下文到节点上下文返回字符串,对象,数字或布尔值(实际上是任何可序列化/可字符串化的值)。
不知道您是否已经掌握以下内容:浏览器/页面上下文和节点上下文不同。在它们之间传输数据的唯一方法是对数据进行字符串化处理然后再进行传输。
说,要解决您的问题,您必须提出一个正则表达式并返回匹配的字符串。完整的工作示例:
假设<pre>
文本是这样的:<pre>[...] myJSONObject:["el1","el2"] [...]</pre>
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
// setup test page
await page.evaluate(() => {
const pre = document.createElement('pre');
pre.innerText = '<pre>[...] myJSONObject:["el1","el2"] [...]</pre>';
document.body.append(pre);
});
// important part (this is the answer to your question)
const myJson = await page.evaluate(() => {
var re = /myJSONObject:(\[.*?])/; // regex to match "json text"
const pre = document.querySelector('pre').innerText;
const matchedJsonText = pre.match(re)[1];
const json = JSON.parse(matchedJsonText);
return json;
});
// show results
console.log('myJSONObject:', myJson);
await browser.close();
})();
请注意,此正则表达式仅适用于您作为示例提供的json。您必须提出一个更好的正则表达式来匹配所需的json。