#html #parsing #node.js
#HTML #синтаксический анализ #node.js
Вопрос:
На самом деле я проанализировал веб-сайт с помощью htmlparser, и я хотел бы найти конкретное значение внутри анализируемого объекта, например, строку «$ 199», и продолжайте отслеживать этот элемент (путем периодического синтаксического анализа), чтобы увидеть, что значение по-прежнему «$ 199» или изменилось.
И после некоторого болезненного глупого поиска с помощью моих глаз я обнаружил, что эта строка находится где-то вот так:
price = handler.dom[3].children[3].children[3].children[5].children[1].
children[3].children[3].children[5].children[0].children[0].raw;
Итак, я хотел бы знать, существуют ли методы, которые менее болезненны? Спасибо!
Комментарии:
1. Ваш вопрос неясен: вы пытаетесь подтвердить, что значение ‘$ 199’ существует в документе (в этом случае регулярное выражение над необработанным HTML может быть самым простым), или пытаетесь найти узел DOM, в котором он определен, или контекст вокруг него, или …?
2. обновлено. Надеюсь, это будет достаточно ясно, спасибо
Ответ №1:
Рекурсивный поиск на основе дерева, вероятно, будет проще всего получить интересующий вас узел.
Я не использовал htmlparser
, и документация кажется немного тонкой, так что это всего лишь пример для начала, и он не тестировался:
function getElement(el,val) {
if (el.children amp;amp; el.children.length > 0) {
for (var i = 0, l = el.children.length; i<l; i ) {
var r = getElement(el.children[i],val);
if (r) return r;
}
} else {
if (el.raw == val) {
return el;
}
}
return null;
}
Вызовите getElement(handler.dom[3],'$199')
, и он будет проходить через все дочерние элементы рекурсивно, пока не найдет элемент без children
, а затем сравнивает его необработанное значение с ‘$ 199’. Обратите внимание, что это прямое сравнение, возможно, вы захотите поменять это на регулярное выражение или подобное?