2017-09-24 62 views
1

我想解析一个网站。我需要在HTML文件中包含一些特定单词的链接。我知道如何找到“href”属性,但我不需要所有这些属性,无论如何要这样做?例如,我可以在HtmlAgilityPack中使用正则表达式吗?从C#中的HTML代码获取特定单词的链接#

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

我正在试图寻找HTML代码中的所有链接。

回答

1

如果你有一个HTML文件中像这样:

<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> 

你正在寻找例如下面的话:thewordother。您可以定义一个正则表达式,然后使用LINQ来获取链接匹配你的正则表达式像这样的属性href

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

注意,有一个contains关键字使用XPath,但你必须复制的条件每个字你正在寻找这样的:

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

还有对XPATH一个matches关键字,不幸的是它仅适用于XPath 2.0和HtmlAgilityPack使用XPath 1.0。使用XPATH 2.0,你可以这样做:

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

我找到了这个,这对我很有用。

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

“HtmlNode links = ...;'的目的是什么?该声明是否应该删除? – AdrianHHH

相关问题