Использование Xpath и HtmlAgilityPack для поиска всех элементов с внутренним текстом, содержащим определенное слово или слова - PullRequest
5 голосов
/ 21 января 2012

Я пытаюсь создать простой поисковый движок, используя 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.

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

Ответы [ 4 ]

12 голосов
/ 21 января 2012

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

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

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

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

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

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

1 голос
/ 09 декабря 2016

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

// * [text ()[содержит (., 'ключевое слово')]]

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

doc.DocumentNode.SelectNodes("//*[text()[contains(., '" + keyword + "')]]");
0 голосов
/ 10 мая 2017

Нечувствительное к регистру решение:

var xpathForFindText = "// * [text () [содержит (перевод (., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '" + lowerFocusKwd + "')]]";

var result = doc.DocumentNode.SelectNodes (xpathForFindText);

Примечание:

Будьте осторожны, так как lowerFocusKwd не должен содержать следующий символ, потому что xpath будет в неправильном формате:

0 голосов
/ 21 января 2012

Используйте следующее:

doc.DocumentNode.SelectNodes("//*[contains(text()[1], " + searchword + ")]")

Выбирает все элементы (*), чей первый текстовый дочерний элемент (text()[1]) содержит searchword.

...