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文件的地址。)
请问如何能获取他们的绝对地址?各位大虾帮帮忙。。急用。
先用正则得到所有的页面源码中所有的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();
}
}
用 Uri 这个类可以将相对地址转换为绝对地址。