不使用eval()评估字符串

时间:2019-08-30 06:18:17

标签: javascript eval

我正在创建一个“通用”网页抓取工具,它将抓取具有条目列表的任何页面。我想从配置中驱动应该提取的标签。

具有以下配置的示例:

{ 
    name : "price",
    valueJQueryExpression : ".mt9 > .mt7.b"
},

...我正在解析以下方式:

const $ = require('cheerio');
let jquery = getQuery("price");
let keys = $(jquery);

但是,我要处理更多棘手的解析器,例如。那个:

let location = $('.mt9 > .b', html).not('.mt5').not('.mt7').text().trim()

在这种情况下,我想使用eval()并在配置中传递完整的表达式。但是,由于安全问题,不建议这样做。

您有其他建议以其他方式处理吗?

2 个答案:

答案 0 :(得分:3)

您应该可以在此处使用:not pseudo class。请尝试以下操作:

$('.mt9 > .b:not(.mt5):not(.mt7)', html).text().trim()

它类似于jQuery,在:not()中指定的选择器将用于从匹配项中排除元素。

您可以在下面的操作中看到它:

.mt9 > .b:not(.mt5):not(.mt7) {
  color: red;
}
<div class="mt9">
  <div class="b">This should be red</div>
  <div class="b mt7">This should not be red</div>
  <div class="b mt5">This should not be red</div>
</div>

答案 1 :(得分:0)

var command = 'console.log("Hello")';
var s = document.createElement("script");
s.textContent = command;
document.head.appendChild(s);