Html Agility Pack, cerca nel sito per una specifica stringa di parole

c# html-agility-pack

Domanda

Sto utilizzando l'Html Agility Pack per questa attività, in pratica ho un URL e il mio programma dovrebbe leggere il contenuto della pagina html e se trova una riga di testo (ad esempio: "John aveva tre mele "), dovrebbe cambiare il testo di un'etichetta in" Trovato ".

Ho provato a farlo con contiene, ma immagino che controlli solo una parola.

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

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

EDIT: Resto del mio codice, ora con il tentativo di 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;
        }
    ...

Risposta accettata

Una possibile opzione sta usando . invece di text() . Passando text() alla funzione contains() , come avevate sospettato, la vostra azione sarà effettiva solo quando il testo cercato è il primo figlio diretto dell'elemento corrente:

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

Nell'altro lato, contains(., '...') valuta l'intero contenuto del testo dell'elemento corrente, concatenato. Quindi, solo un heads-up, l'XPath di cui sopra prenderà in considerazione anche il seguente elemento, ad esempio, come una corrispondenza:

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

Se è necessario che l'XPath consideri solo i casi in cui l'intera parola chiave è contenuta in un singolo nodo di testo e pertanto considera il caso precedente come non corrispondente, è possibile provare in questo modo:

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

Se nessuna di queste soluzioni funziona per te, pubblica uno snippet HTML minimo che contenga la parola chiave, ma non ha restituito alcuna corrispondenza, in modo che possiamo esaminare ulteriormente ciò che potrebbe causare questo comportamento e come risolverlo.


Risposta popolare

Usa questo:

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


Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché