欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#抓取网页数据 解析标题描述图片等信息 去除HTML标签

程序员文章站 2023-09-08 09:20:32
一、首先将网页内容整个抓取下来,数据放在byte[]中(网络上传输时形式是byte),进一步转化为string,以便于对其操作,实例如下: 复制代码 代码如下: pri...

一、首先将网页内容整个抓取下来,数据放在byte[]中(网络上传输时形式是byte),进一步转化为string,以便于对其操作,实例如下:

复制代码 代码如下:

private static string getpagedata(string url)
{
    if (url == null || url.trim() == "")
        return null;
    webclient wc = new webclient();
    wc.credentials = credentialcache.defaultcredentials;
    byte[] pagedata = wc.downloaddata(url);
    return encoding.default.getstring(pagedata);//.ascii.getstring
}

二、得到了数据的字符串形式,然后可以对网页进行解析了(其实就是对字符串的各种操作和正则表达式的应用):

常用的的解析还有以下几种:

1.获取标题

复制代码 代码如下:

match titlematch = regex.match(strresponse, "<title>([^<]*)</title>", regexoptions.ignorecase | regexoptions.multiline);
title = titlematch.groups[1].value;

2.获取描述信息

复制代码 代码如下:

match desc = regex.match(strresponse, "<meta name=\"description\" content=\"([^<]*)\">", regexoptions.ignorecase | regexoptions.multiline);
strdesc = desc.groups[1].value;

3.获取图片

复制代码 代码如下:

public class htmlhelper
{
    /// <summary>
    /// html中提取图片地址
    /// </summary>
    public static list<string> pickupimgurl(string html)
    {
        regex regimg = new regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgurl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", regexoptions.ignorecase);
        matchcollection matches = regimg.matches(html);
        list<string> lstimg = new list<string>();
        foreach (match match in matches)
        {
            lstimg.add(match.groups["imgurl"].value);
        }
        return lstimg;
    }
    /// <summary>
    /// html中提取图片地址
    /// </summary>
    public static string pickupimgurlfirst(string html)
    {
        list<string> lstimg = pickupimgurl(html);
        return lstimg.count == 0 ? string.empty : lstimg[0];
    }
}

4.去除html标签

复制代码 代码如下:

private string striphtml(string strhtml)
{
    regex objregexp = new regex("<(.|\n)+?>");
    string stroutput = objregexp.replace(strhtml, "");
    stroutput = stroutput.replace("<", "<");
    stroutput = stroutput.replace(">", ">");
    return stroutput;
}

有些例外会使得去除不干净,所以建议连续两次转化。这样将html标签转化为了空格。太多连续的空格会影响之后对字符串的操作。所以再加入这样的语句:

复制代码 代码如下:

//把所有空格变为一个空格
regex r = new regex(@"\s+");
wordsonly = r.replace(strresponse, " ");
wordsonly.trim();