Obtenir des liens avec des mots spécifiques à partir d'un code HTML en C #

c# html-agility-pack regex

Question

J'essaie d'analyser un site Web. J'ai besoin de liens dans un fichier HTML contenant des mots spécifiques. Je sais comment trouver les attributs "href", mais je n'ai pas besoin de tous les attributs. Par exemple, puis-je utiliser regex dans HtmlAgilityPack?

HtmlNode links = document.DocumentNode.SelectSingleNode("//*[@id='navigation']/div/ul");

foreach (HtmlNode urls in document.DocumentNode.SelectNodes("//a[@]"))
{
    this.dgvurl.Rows.Add(urls.Attributes["href"].Value);
}   

J'essaie ceci pour trouver tous les liens dans le code HTML.

Réponse acceptée

Si vous avez un fichier HTML comme celui-ci:

<div class="a">
    <a href="http://www.website.com/"></a>
    <a href="http://www.website.com/notfound"></a>
    <a href="http://www.website.com/theword"></a>
    <a href="http://www.website.com/sub/theword"></a>
    <a href="http://www.website.com/theword.html"></a>
    <a href="http://www.website.com/other"></a>
</div>

Et vous recherchez par exemple les mots suivants: theword et other . Vous pouvez définir une expression régulière, puis utiliser LINQ pour obtenir les liens avec un attribut href correspondant à votre expression régulière, comme ceci:

<div class="a">
    <a href="http://www.website.com/"></a>
    <a href="http://www.website.com/notfound"></a>
    <a href="http://www.website.com/theword"></a>
    <a href="http://www.website.com/sub/theword"></a>
    <a href="http://www.website.com/theword.html"></a>
    <a href="http://www.website.com/other"></a>
</div>

Notez qu'il existe un mot clé contains avec XPATH, mais vous devrez dupliquer la condition pour chaque mot que vous recherchez comme:

<div class="a">
    <a href="http://www.website.com/"></a>
    <a href="http://www.website.com/notfound"></a>
    <a href="http://www.website.com/theword"></a>
    <a href="http://www.website.com/sub/theword"></a>
    <a href="http://www.website.com/theword.html"></a>
    <a href="http://www.website.com/other"></a>
</div>

Il y a aussi un matches mot - clé pour XPATH, malheureusement , il est uniquement disponible avec XPath 2.0 et HtmlAgilityPack utilise XPath 1.0. Avec XPATH 2.0, vous pourriez faire quelque chose comme ceci:

<div class="a">
    <a href="http://www.website.com/"></a>
    <a href="http://www.website.com/notfound"></a>
    <a href="http://www.website.com/theword"></a>
    <a href="http://www.website.com/sub/theword"></a>
    <a href="http://www.website.com/theword.html"></a>
    <a href="http://www.website.com/other"></a>
</div>

Réponse populaire

Je trouve ceci et cela fonctionne pour moi.

HtmlNode links = document.DocumentNode.SelectSingleNode("//*[@id='navigation']/div/ul");
    foreach (HtmlNode urls in document.DocumentNode.SelectNodes("//a[@]"))
        {
           var temp = catagory.Attributes["href"].Value;
           if (temp.Contains("some_word"))
              {
                dgv.Rows.Add(temp);
              }
        }



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi