2012-08-08 97 views
1

我想从网站的首页收集一些数据。我可以轻松地遍历每一行,并且它只是我感兴趣的一个特定的一行。因此,我想确定正确的行并提取数字,在此情况下为324.我该怎么做?如何从网页提取信息?

<h2><a href="/mmp/it/su/">Weather</a></h2> <span class="jix_channels_count">(324)</span><br><p class="jix_channels_desc">Prog&oslash;r, su, si&oslash;r, tester</p> 

回答

2

下载内容后,使用HTML解析器如HTML Agility Pack识别span元件属于jix_channels_count类。

另一种选择是SgmlReader

您与regex标记你的问题 - 我衷心建议你不采取这个方向发展。

建议的方法(与SgmlReader)变为或多或少像这样:

var url = "www.that-website.com/foo/"; 
var myRequest = (HttpWebRequest)WebRequest.Create(url); 
myRequest.Method = "GET"; 
WebResponse myResponse = myRequest.GetResponse();     
var responseStream = myResponse.GetResponseStream(); 
var sr = new StreamReader(responseStream, Encoding.Default); 
var reader = new SgmlReader 
      { 
       DocType = "HTML", 
       WhitespaceHandling = WhitespaceHandling.None, 
       CaseFolding = CaseFolding.ToLower, 
       InputStream = sr 
      }; 
var xmlDoc = new XmlDocument(); 
xmlDoc.Load(reader); 
var nodeReader = new XmlNodeReader(xmlDoc); 
XElement xml = XElement.Load(nodeReader); 

现在你可以使用LINQ到XML到(递归或其他方式)与属性class,其值等于找到span元素jix_channels_count并读取该元素的值。

+1

关于正则表达式,我问这个问题,希望会有更好的办法:-) – 2012-08-08 07:27:47

2

用正则表达式解析html页面是错误的。如果你知道单行html的确切结构,你可以使用正则表达式,而不必将行看作html代码。

假设的数量始终是括号,并与jix_channels_count类跨度内:

Match match = Regex.Match(htmlLine, @"(\<span[^>]*class=""jix_channels_count[^>]*\>\()([^)]+)(\))", RegexOptions.IgnoreCase); 
if (match.Success) 
{ 
    string number = match.Groups[2].Value; 
} 
+0

也被称为“HTML解析克苏鲁方式“;) – 2012-08-08 07:40:25

+1

哈哈对。仍然请注意,您不是将页面解析为HTML,这是错误的。你只是知道它的结构解析一行html代码。 – 2012-08-08 08:24:09