Estoy tratando de analizar un sitio web. Necesito algunos enlaces en el archivo HTML que contiene algunas palabras específicas. Sé cómo encontrar los atributos "href" pero no los necesito todos, ¿hay alguna forma de hacerlo? Por ejemplo, ¿puedo usar expresiones regulares en 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);
}
Estoy intentando esto para encontrar todos los enlaces en código HTML.
Si tienes un archivo HTML como este:
<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>
Y estás buscando por ejemplo las siguientes palabras: theword
y other
. Puede definir una expresión regular, luego usar LINQ para obtener los enlaces con un atributo href
coincida con su expresión regular de la siguiente manera:
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);
}
Tenga en cuenta que hay una palabra clave contains
con XPATH, pero tendrá que duplicar la condición de cada palabra que busca:
node.SelectNodes(".//a[contains(@href,'theword') or contains(@href,'other')]")
También hay una palabra clave de matches
para XPATH, desafortunadamente solo está disponible con XPATH 2.0 y HtmlAgilityPack usa XPATH 1.0. Con XPATH 2.0, podrías hacer algo como esto:
node.SelectNodes(".//a[matches(@href,'(theword|other)')]")
Encuentro esto y eso funciona para mí.
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);
}
}