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.
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:
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 existe 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 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:
node.SelectNodes(".//a[matches(@href,'(theword|other)')]")
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);
}
}