最近在做一个项目,需要使用行政区划的,可是在网上搜索了很久,都没有查到有最新的现成的文档。我知道在国家统计局的网站上是有整个国家的行政区划的,但是也是一个网页一个网页的,很难用复制粘贴的方式获取。那我就实现一个抓取网页的功能,从国家统计局的网站上抓取行政区划的数据。
网页的获取是一个很简单的过程,我们定义WebRequest 类来访问网址,然后WebResponse 类来接收响应的数据,然后用StreamReader 来读取流信息就可以了,下面是抓取网页并返回网页内容的函数,代码如下:
/// 获取网页内容
/// </summary>
/// <param name="myUrl">网址</param>
/// <param name="encoding">编码</param>
/// <returns></returns>
private string GetRequestInfo(string myUrl, string encoding)
{
WebRequest request = WebRequest.Create(myUrl);
WebResponse response = request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(),
Encoding.GetEncoding(encoding));//gb2312 "utf-8"
string htmlContent = reader.ReadToEnd();
System.Threading.Thread.Sleep(1);
return htmlContent;
}
函数中的encoding是我们要注意的,中文网页有的使用gb2312,有的使用utf-8,我们要根据网页的编码来传参数。
国家最新行政区划的网址为http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201504/t20150415_712722.html,使用ie查看源代码,看到区划代码名称的css类型都是MsoNormal。这个很重要,我们等下在使用HtmlAgilityPack这个dll解析网址的时候,就会用到。HtmlAgilityPack是开源的解析网址内容的利器,专门解析网页的内容,我现在只是使用.net framework 2.0的。
/// <summary>
/// 解析
/// </summary>
private List<string> AnalyHtmlContentSinglePage(string htmlContent, string trClass)
{
List<string> list = new List<string>();
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(htmlContent);
HtmlAgilityPack.HtmlNodeCollection trList = doc.DocumentNode.SelectNodes(trClass);
if (trList != null)
{
foreach (HtmlAgilityPack.HtmlNode hn in trList)
{
string code = string.Empty;
string name = string.Empty;
string flag = string.Empty;
code = hn.InnerText;
if (code.Contains(" "))
{
flag = "3";
}
else if (code.Contains(" "))
{
flag = "2";
}
else if (code.Contains(" "))
{
flag = "1";
}
else
{
flag = string.Empty;
}
code = code.Replace(" ", "\t");
code = code.Replace(" ", "\t");
string[] sa = code.Split(new char[] { '\t' });
code = sa[0];
for (int i = 1; i < sa.Length; i++)
{
if (string.IsNullOrEmpty(sa[i])) continue;
name = sa[i].Trim();
}
list.Add(code + "\t" + name);
}
}
return list;
}
我将获取的网页内容传给这个函数,类型是MsoNormal。我们只能通过空格来识别行政级别,省空格较少,市级空格比省更长,县或者区的空格最长。这些都是查看网页源码获取的。
只要使用这两个函数就能获取网页解析网页内容,得到行政区划。