如何从网页中提取信息?

时间:2012-08-08 07:19:57

标签: c# html regex

我想从网站的首页收集一些数据。我可以很容易地浏览每一行,它只是我感兴趣的一个特定的一行。所以我想确定正确的行并提取数字,在这种情况下是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 个答案:

答案 0 :(得分:2)

下载内容后,使用HTML Agility Pack等HTML解析器来识别属于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 to XML(递归地或以其他方式)查找具有值span的{​​{1}}元素,其值等于class并读取该元素的值。 / p>

答案 1 :(得分: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;
}