2017-09-24 21 views
1

J'essaye d'analyser un site Web. J'ai besoin de liens dans le fichier HTML qui contient des mots spécifiques. Je sais comment trouver les attributs "href" mais je n'ai pas besoin de tous, est-ce qu'il y a de toute façon à faire ça? Par exemple, puis-je utiliser regex dans HtmlAgilityPack? J'essaye ceci pour trouver tous les liens dans le code HTML.Obtenir des liens avec des mots spécifiques d'un code HTML en C#

Répondre

1

Si vous avez un fichier HTML 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> 

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

Regex regex = new Regex("(theworld|other)", RegexOptions.IgnoreCase); 

HtmlNode node = htmlDoc.DocumentNode.SelectSingleNode("//div[@class='a']"); 
List<HtmlNode> nodeList = node.SelectNodes(".//a").Where(a => regex.IsMatch(a.Attributes["href"].Value)).ToList<HtmlNode>(); 

List<string> urls = new List<string>(); 

foreach (HtmlNode n in nodeList) 
{ 
    urls.Add(n.Attributes["href"].Value); 
} 

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

node.SelectNodes(".//a[contains(@href,'theword') or contains(@href,'other')]") 

il y a aussi un mot-clé pour matches 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:

node.SelectNodes(".//a[matches(@href,'(theword|other)')]") 
0

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); 
       } 
     } 
+1

Quel est l'objectif de 'HtmlNode links = ...;'? Cette déclaration devrait-elle être supprimée? – AdrianHHH