2009-10-03 42 views
27

使用C#我想解析HTML页面来了解如何获得文本框的值:从这个样品HTML脚本(即约翰):与HtmlAgilityPack

<TD class=texte width="50%"> 
<DIV align=right>Name :<B> </B></DIV></TD> 
<TD width="50%"><INPUT class=box value=John maxLength=16 size=16 name=user_name> </TD> 
<TR vAlign=center> 

回答

45

有许多方法可以使用敏捷包选择元素。

假设我们已经定义了HtmlDocument如下:

string html = @"<TD class=texte width=""50%""> 
<DIV align=right>Name :<B> </B></DIV></TD> 
<TD width=""50%""> 
    <INPUT class=box value=John maxLength=16 size=16 name=user_name> 
</TD> 
<TR vAlign=center>"; 

HtmlDocument htmlDoc = new HtmlDocument(); 
htmlDoc.LoadHtml(html); 

1.简单的LINQ
我们可以使用Descendants()方法,传递一个元素的名称,我们正在寻找的:

var inputs = htmlDoc.DocumentNode.Descendants("input"); 

foreach (var input in inputs) 
{ 
    Console.WriteLine(input.Attributes["value"].Value); 
    // John 
} 

2.更高级的LINQ
我们可以缩小下来使用LINQ票友:

var inputs = from input in htmlDoc.DocumentNode.Descendants("input") 
      where input.Attributes["class"].Value == "box" 
      select input; 

foreach (var input in inputs) 
{ 
    Console.WriteLine(input.Attributes["value"].Value); 
    // John 
} 

3的XPath
或者,我们可以使用XPath

string name = htmlDoc.DocumentNode 
    .SelectSingleNode("//td/input") 
    .Attributes["value"].Value; 

Console.WriteLine(name); 
//John 
+0

LINQ:在其中该属性是不存在的情况下我用下面的LINQ用于'其中input.Attributes [ “类”] = NULL && input.Attributes [ “类”]值==“!盒子“' – 2014-09-25 06:31:22

2
HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(html); 
XPathNavigator docNav = doc.CreateNavigator(); 

XPathNavigator node = docNav.SelectSingleNode("//td/input/@value"); 

if (node != null) 
{ 
    Console.WriteLine("result: " + node.Value); 
} 

我写了这个漂亮的很快,所以你我们想用更多的数据做一些测试。

注:XPath字符串显然必须小写。

编辑︰显然测试版现在直接支持Linq到对象,所以可能不需要转换器。