技术开发 频道

方便可靠!Html Agility Pack解析HTML页

  当然,也有很多其他的方法去获得指定的结点的信息,比如,Ancestors方法返回所有的祖先结点,而SelectNodes方法则返回匹配XPath表达式的结点集合。

  有了这些方法和属性,现在我们就有很多方法去获得HTML文档中的所有 标签。这个例子中将采用SelectNodes方法。下面的语句调用了document对象的的DocumentNode属性中的SelectNodes方法,使用了xpath表达式”//meta”,返回了所有文档中的 标记。

  var metaTags = document.DocumentNode.SelectNodes("//meta");

  如果在文档中没有 标签,则metaTags变量会为null,如果有多于一个 标签,则metaTags会是一个HtmlNode的对象集合了,我们可以遍历并且显示它们的属性,如下代码:

if (metaTags != null)
{
   foreach (var tag in metaTags)
   {
      
if (tag.Attributes["name"] != null && tag.Attributes["content"] != null)
      {
         ... 输出 tag.Attributes[
"name"].Value 和 tag.Attributes["content"].Value ...
      }
   }
}

  上面的代码中,首先使用了foreach去循环metaTags集合中的每个元素,然后判断每个元素的name和content属性的值是否为空,如果不空的话,直接输出其内容就可以了,看到了么,根本不需要用正则表达式,十分方便。

  下图则是采用了上面的代码后的效果,用户在这里输入了要访问的地址,点提交按钮,则Html Agility会下载网页的内容,以及使用上文介绍的方法,去取得 标签内的内容并且显示出来。


  例子二 列出远程页面中的链接

  上面的例子演示了如何使用SelectNodes方法和xpath去查找指定的结点。而另外一个方法是使用Linq的语法去实现。HtmlNode类的方法,比如返回文档的祖先或者子孙结点的,实际上返回的都是象IEnumerable 的对象的,如果你对Linq语法熟悉,则知道Linq是很容易处理IEnumerable的,而且可以很容易使用Linq去查询HTML文档的结点。

  为了演示如何使用Linq去访问结点,在这个例子中,将演示如何去获得某个页面的文本和所有超级链接(标签)的值。一开始的代码跟第一个例子是相同的,要创建HtmlWeb对象:

var webGet = new HtmlWeb();
  var document
= webGet.Load(url);

        标签中的,当然我们要求这些标签中是要内容的,不能只是空白,最后返回一个匿名类型,有两个属性:Url和Text:

  接下来,将使用到document对象的Descendants方法和linq语法去获得指定页面的所有链接。准确的说,是获得页面中所有

var linksOnPage = from lnks in document.DocumentNode.Descendants()
                  where lnks.Name
== "a" &&
                       lnks.Attributes[
"href"] != null &&
                       lnks.InnerText.Trim().Length
> 0
                  
select new
                  {
                     Url
= lnks.Attributes["href"].Value,
                     Text
= lnks.InnerText
                  };

  看到了么,上面使用的正是LINQ语法。现在我们就可以使用一些asp.net的控件去展示这个linksOnPage中的内容了,本文代码中使用的是listview控件,命名为lvLinks:

lvLinks.DataSource = linksOnPage;
  lvLinks.DataBind();

  前端的listbview变的简单了,如下:

<asp:ListView ID="lvLinks" runat="server">
  
<LayoutTemplate>
      
<ul>
        
<asp:PlaceHolder runat="server" ID="itemPlaceholder" />
      
</ul>
  
</LayoutTemplate>
  
  
<ItemTemplate>
      
<li>
        
<%# Eval("Text") %> - <%# Eval("Url") %>
      
</li>
  
</ItemTemplate>
</asp:ListView>

  运行后,如下图所示:

w

0
相关文章