Html Agility Pack, поиск по сайту для определенной строки слов

c# html-agility-pack

Вопрос

Я использую Html Agility Pack для этой задачи, в основном у меня есть URL-адрес, и моя программа должна прочитать содержимое html-страницы на нем, и если она найдет строку текста (то есть: «У Джона было три яблоки "), он должен изменить текст ярлыка на« Найденный ».

Я попытался сделать это с помощью contains, но, я думаю, он проверяет только одно слово.

var nodeBFT = doc.DocumentNode.SelectNodes("//*[contains(text(), 'John had three apples')]");

if (nodeBFT != null && nodeBFT.Count != 0)
    myLabel.Text = "Found it";

EDIT: Остальная часть моего кода, теперь с попыткой ako:

if (CheckIfValidUrl(v)) // foreach var v in a list..., checks if the URL works
{
    HtmlWeb hw = new HtmlWeb();
    HtmlDocument doc = hw.Load(v);

    try
    {
        if (doc.DocumentNode.InnerHtml.ToString().Contains("string of words"))
        {
            mylabel.Text = v;
        }
    ...

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

Один из возможных вариантов - использование . вместо text() . Передача функции text() to contains() так, как вы предполагали, будет эффективна только тогда, когда искомый текст является первым прямым дочерним элементом текущего элемента:

doc.DocumentNode.SelectNodes("//*[contains(., 'John had three apples')]");

На другой стороне contains(., '...') оценивается весь текстовый контент текущего элемента, объединенный. Итак, только хэдз-ап, вышеупомянутый XPath также рассмотрит следующий элемент, например, как совпадение:

<span>John had <br/>three <strong>apples</strong></span>

Если вам нужно, чтобы XPath рассматривал только случаи, когда ключевое слово целиком содержалось в одном текстовом узле, и поэтому рассматривает вышеуказанный случай как несоответствие, вы можете попробовать таким образом:

doc.DocumentNode.SelectNodes("//*[text()[contains(., 'John had three apples')]]");

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


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

использовать это:

if (doc.DocumentNode.InnerHtml.ToString().Contains("John had three apples"))
    myLabel.Text="Found it";


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