Использование Xpath и HtmlAgilityPack для поиска всех элементов с внутренним текстом, содержащим определенное слово или слова

html-agility-pack xpath

Вопрос

Я пытаюсь создать простую поисковую систему, используя HtmlAgilityPack и Xpath с C # (.NET 4). Я хочу найти каждый узел, содержащий определяемый пользователем поисковый запрос, но я не могу получить право XPath. Например:

<HTML>
 <BODY>
  <H1>Mr T for president</H1>
   <div>We believe the new president should be</div>
   <div>the awsome Mr T</div>
   <div>
    <H2>Mr T replies:</H2>
     <p>I pity the fool who doesn't vote</p>
     <p>for Mr T</p>
   </div>
  </BODY>
</HTML>

Если указанный поисковый запрос «Mr T», мне нужны следующие узлы: <H1> , второй <div> , <H2> и второй <p> . Я пробовал множество вариантов doc.DocumentNode.SelectNodes("//text()[contains(., "+ searchword +")]"); но я всегда, кажется, заканчиваю каждый узел во всей DOM.

Любые намеки, чтобы получить меня в правильном направлении, были бы очень благодарны.

Принятый ответ

Использование :

//*[text()[contains(., 'Mr T')]]

Это выбирает все элементы в документе XML, у которых есть дочерний элемент текстового узла, который содержит строку 'Mr T' .

Это также можно записать короче :

//*[text()[contains(., 'Mr T')]]

Это выбирает родителя (ов) любого текстового узла, который содержит строку 'Mr T' .


Популярные ответы

Согласно Xpath, если вы хотите найти определенное ключевое слово, вам нужно следовать формату («ключевое слово» - это слово, которое вы хотите искать):

// * [текст () [содержит (., 'keyword')]]

Вы должны следовать тому же формату, что и выше в C #, keyword - это строковая переменная, которую вы вызываете:

doc.DocumentNode.SelectNodes("//*[text()[contains(., '" + keyword + "')]]");



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему