Html Agility Pack, busca en el sitio una cadena de palabras específica

c# html-agility-pack

Pregunta

Estoy usando Html Agility Pack para esta tarea, básicamente tengo una URL, y mi programa debería leer el contenido de la página html en ella, y si encuentra una línea de texto (es decir: "John tenía tres manzanas "), debe cambiar el texto de una etiqueta a" Encontrado ".

Intenté hacerlo con Contenidos, pero supongo que solo comprueba una palabra.

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

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

EDIT: resto de mi código, ahora con el intento de 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;
        }
    ...

Respuesta aceptada

Una posible opción es usar . en lugar de text() . El paso de text() a contains() funciona de la manera que lo hizo, como usted sospechó, efectivo solo cuando el texto buscado es el primer elemento secundario directo del elemento actual:

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

En el otro lado, contains(., '...') evalúa todo el contenido de texto del elemento actual, concatenado. Entonces, solo un aviso, el XPath anterior también considerará el siguiente elemento, por ejemplo, como una coincidencia:

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

Si necesita que XPath considere solo los casos en que la palabra clave completa está contenida en un solo nodo de texto y, por lo tanto, considera que el caso anterior no coincide, puede intentarlo de esta manera:

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

Si nada de lo anterior funciona para usted, publique un fragmento de código HTML mínimo que contenga la palabra clave pero que no devuelva ninguna coincidencia, para que podamos examinar más a fondo lo que posiblemente cause ese comportamiento y cómo solucionarlo.


Respuesta popular

utilizar esta:

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


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué