JavaScript, как найти тот узел DOM, который содержит текст? - PullRequest
0 голосов
/ 04 октября 2018

Учитывая извлеченную HTML-страницу, я хочу найти определенный узел, который содержит часть текста.Сложный способ, который я предполагаю, заключался бы в том, чтобы перебирать все узлы по одному, углубляясь до предела, и для каждого случая выполнять поиск, например, .includes()

Но каков разумный путь?Должно быть что-то, но я не могу правильно гуглить для этого

    response = axios.get(url);
    let parsedHtml = parser.parseFromString(response.data, 'text/html');
    for (let i = 0; i < parsedHtml.children.length; i++)
       if (parsedHtml.children[i].textContent.includes('hello'))
          console.log(parsedHtml.children[i])

* это не работает

* Пример кода

<html>
 <body>
  <div>dfsdf</div>
  <div>
   <div>dfsdf</div>
   <div>dfsdf</div>
  </div>
  <div>
   <div>
    <div>hello</div>
   </div>
  </div>
  <div>dfsdf</div>
 </body>
 </html>

Я бы хотелхотел бы получить <div>hello</div> как элемент узла

1 Ответ

0 голосов
/ 04 октября 2018

После того, как я почти убедился, что мне пришлось пройти через DOM классическим способом, я нашел это здесь Javascript: как перебрать ВСЕ элементы DOM на странице? , что действительно отлично:

    let nodeIterator = document.createNodeIterator(
        parsedHtml,
        NodeFilter.SHOW_ELEMENT,
        (node) => {
            return (node.textContent.includes('mytext1')
                || node.textContent.includes('mytext2'))
                && node.nodeName.toLowerCase() !== 'script' // not interested in the script
                && node.children.length === 0 // this is the last node
                ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
        }
    );
    let pars = [];
    let currentNode;

    while (currentNode = nodeIterator.nextNode())
        pars.push(currentNode);
    console.log(pars[0].textContent); // for example
...