Как я могу найти узел в HTML с размеченным текстом путем поиска открытого текста? - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь найти «ближайшие» узлы в документе HTML, который содержит во внутреннем тексте определенную строку, используя библиотеки xpath или javascript (node); в HTML-фрагменте вроде

<p>Lorem ipsum dolor sit <strong>amet, <em>{cons</em>ectetur} adipiscing elit.</strong> Morbi rhoncus lacinia orci a dapibus. Nulla facilisi. Sed id nibh ornare, aliquet ante nec, efficitur leo. Sed viverra ex turpis,</p>

если я ищу слова, которые соответствуют {cons.*tur}, поэтому в этом случае {consectetur} я хочу найти узел <strong>, а не узел <p>, потому что это самый маленький узел, который имеет его.

edit: strong - это всего лишь пример, это может быть любой tagName, и он может быть глубоко вложенным; слово, которое я ищу, также может быть разбито более чем на два уровня вложенности, как в примере выше.

больше редактировать: я на самом деле ищу шаблон, поэтому //div[contains(., 'consectetur')] не будет работать.

Ответы [ 2 ]

1 голос
/ 16 марта 2019

, если я ищу слова, которые соответствуют {cons.*tur}, поэтому в этом случае {consectetur}, я хочу найти узел <strong>, а не узел <p>, потому что это самый маленький узел, который имеетit.

Вам нужно выражение, которое выбирает последний элемент-потомок, значение строки которого соответствует вашему шаблону.Так что

/descendant::*[contains(.,'{consectetur}')][last()]

Если нужно выбрать более одного элемента (другую ветвь), тогда вам понадобится выражение для выбора и элемент, соответствующий вашему шаблону, без потомка, также соответствующего ему.

//*[contains(.,'{consectetur}') and not(.//*[contains(.,'{consectetur}'])]

О тогда шаблоне

Если вы хотите использовать регулярное выражение, вам нужно как минимум XPath 2.0 функции .Ваш текущий шаблон {cons.*tur} в XPath 1.0 совпадает с

contains(substring-after(.,'{cons'),'tur}')
0 голосов
/ 15 марта 2019

Используйте свойство .textContent для извлечения текста из тега.

const str = document.querySelector('body *:not(script)').textContent;
console.log(str);

const rgx = /consectetur/g;

let res = rgx.exec(str);
while (res !== null) {
  console.log(res[0]);
  res = rgx.exec(str);
}
<p>Lorem ipsum dolor sit <strong>amet, <em>cons</em>ectetur adipiscing elit.</strong> Morbi rhoncus lacinia orci a dapibus. Nulla facilisi. Sed id nibh ornare, aliquet ante nec, efficitur leo. Sed viverra ex turpis,</p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...