【发布时间】:2021-01-08 00:29:40
【问题描述】:
我想从 Puppeteer 中的 DOM 中剥离一些元素和 cmets。这些项目没有我可以使用 CSS 选择的可识别 ID、类或属性。但是,它们可能由内部字符串标识,并且某些元素可能包装在人类可读的 cmets 中。到目前为止我的尝试:
- 似乎不可能使用 CSS 选择器,因为它们只能使用 ID 或类:there is no CSS
contains()selector。所以我尝试用 XPath 来做... - 可以使用 XPath 选择(并可能删除?)某些元素,但我是 Puppeteer 和 XPath 的新手。我在下面提供了我失败的尝试。
- 我可能会改用正则表达式,但我不知道如何在解析 HTML 后从 DOM 中删除字符串。
有什么想法吗?谢谢。
因此,在下面的示例中,我想删除<!-- DELETE ME ... --> cmets 之间的元素,以及末尾的<!-- DELETE ME ... --> cmets:
<html>
<head>
<!-- DELETE ME BEGIN -->
<script>
// delete me
console.log('delete me')
</script>
<!-- DELETE ME END -->
<title>Page Title</title>
</head>
<body>
<!-- DELETE ME BEGIN -->
<style>
body {
/* delete me */
color: red;
}
</style>
<script>
// delete me
console.log('delete me')
</script>
<!-- DELETE ME END-->
<style>
body {
/* keep me */
color: green;
}
</style>
<script>
// keep me
console.log("keep me")
</script>
<p>Keep me</p>
<!-- keep me -->
</body>
</html>
<!-- DELETE ME -->
<!-- DELETE ME TOO -->
Puppeteer/XPath 代码(只是一个尝试,还没有做任何事情):
const browser = await puppeteer.launch();
const page = await browser.newPage();
page.on("console", (log) => console[log._type](log._text));
const html = await page.evaluate(() => {
var evaluator = new XPathEvaluator();
var result = evaluator.evaluate(
"//script[contains(.,'delete me')]",
document,
null,
XPathResult.ANY_TYPE
);
console.log(result);
return document.documentElement.outerHTML;
});
await browser.close();
【问题讨论】:
标签: javascript xpath css-selectors puppeteer