首页 新闻 会员 周边 捐助

类似爬虫的问题

0
悬赏园豆:50 [已解决问题] 解决于 2009-09-30 13:12

  static string GetHtml(string url)
    {
        return GetHtml(url, null);
    }

    // 获取网页的HTML内容,指定Encoding
    static string GetHtml(string url, Encoding encoding)
    {
        byte[] buf = new WebClient().DownloadData(url);
        if (encoding != null) return encoding.GetString(buf);
        string html = Encoding.UTF8.GetString(buf);
        encoding = GetEncoding(html);
        if (encoding == null || encoding == Encoding.UTF8) return html;
        return encoding.GetString(buf);
    }

    // 根据网页的HTML内容提取网页的Encoding
    static Encoding GetEncoding(string html)
    {
       
        string pattern = @"(?i)\bcharset=(? <charset>[-a-zA-Z_0-9]+)";
        string charset = Regex.Match(html, pattern).Groups["charset"].Value;
        try { return Encoding.GetEncoding(charset); }
        catch (ArgumentException) { return null; }
    }
从CSDN找个这个方法区别的网站内容,但是有个问题。网页的CSS文件和JS文件别人用的是相对地址,无法获取。(包括CSS里可能有设置背景图片之类的用的也是相对地址,是相对于CSS文件的地址。)
请问如何能获取他们的绝对地址?各位大虾帮帮忙。。急用。

深蓝色的鱼的主页 深蓝色的鱼 | 初学一级 | 园豆:50
提问于:2009-09-29 13:59
< >
分享
最佳答案
0

先用正则得到所有的页面源码中所有的url,

可以参考这个


(?<=href\s*=)(?:[ \s""']*)(?!#|mailto|location.|javascript|.*css|.*this\.)[^""']*(?:[ \s>""'])


得到的值可能如下:

"/company/list.aspx"

"http://www.sohu.com/index.html"

..


然后再拼接加上前缀,这个前缀就是你的页面的根目录,你爬之前就已经知道的。

大概写了个简单例子:获取页面内容部分省略了·! 网上资源很多。
也可以看这里

http://www.cnblogs.com/downmoon/archive/2009/07/01/1514519.html


 public static void Main(string[] args)
{
string minHtml = string.Empty;
string url = @"http://www.agronet.com.cn/default.aspx";
string preurl = url.Remove(url.IndexOf('/', 8) + 1);//获取url的根目录地址
minHtml = GetRequestString(url, 6000, 1, System.Text.Encoding.UTF8);//获取指定页面的内容
Console.WriteLine(preurl);
GetUrlListBHtml(minHtml,preurl);
Console.ReadKey();
}
/// <summary>
/// 获取html内容中的相对url地址,并向相对地址添加前缀
/// </summary>
/// <param name="text">html内容</param>
/// <param name="pre">要添加的绝对地址前缀</param>
public static void GetUrlListBHtml(string text,string pre)
{
string pat = @"(?<=href\s*=)(?:[ \s""']*)(?!#|mailto|location.|javascript|.*css|.*this\.)[^""']*(?:[ \s>""'])";
// Compile the regular expression.
System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(pat, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
// Match the regular expression pattern against a text string.
System.Text.RegularExpressions.Match m = r.Match(text);
int matchCount = 0;
while (m.Success)
{
string urlX=m.Value.Replace("\"","");//替换引号
if (urlX.IndexOf("/") == 0)//相对地址
{
matchCount
++;
Console.WriteLine(
"" + matchCount+"个相对地址:");
Console.WriteLine(
"原地址是"+urlX);
Console.WriteLine(
"新的绝对地址是" + pre+urlX);
Console.WriteLine(
"------------------------------------");
}
m
= m.NextMatch();
}
}

收获园豆:50
邀月 | 高人七级 |园豆:25475 | 2009-09-29 14:10
其他回答(1)
0

用 Uri 这个类可以将相对地址转换为绝对地址。

eaglet | 园豆:17139 (专家六级) | 2009-09-30 09:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册