首先要先找到民政局的区划代码地址:http://www.mca.gov.cn/article/sj/xzqh/2020/
这个网址的最后是根据年份来追加的。可以自己获取当前年份份来访问,我们需要的是页面列表的第一条数据链接。民政部的数据有一定的延迟,略滞后于区划调整文件发布时间。
在这里插入图片描述
通过分析可以看出我们需要的链接在一个table标签下的tr标签里面,其中的第二个td标签包含的a标签的href属性就是我们最终要拿到的链接。
不过我是通过另一个页面获取到的,在民政局的官网民政数据选项里:http://www.mca.gov.cn/article/sj/
我们一样可以获取,里面有区划代码的板块,我们要获取的同样是第一条数据。
在这里插入图片描述
我这里直接选取了class="tzggbox_c_b"的div标签来获取a标签的href的属性值。`
String url= Jsoup.connect(Constant.MCA_URL)
.get()
.getElementsByClass("tzggbox_c_b")
.get(2)
.select("a[href]")
.attr("abs:href");
这里我们获得一个html的网页链接,访问这个链接你会发现代码拿到的html页面跟我们最终要进入的页面不一样,再一对比两个链接,也是没有什么关系。最终要进入的页面链接在哪里呢?细心查看代码获取到的html,你会发现里面有个一个script标签包含这样的属性值,这里面包含的链接才是最终的链接指向。
window.location.href="http://www.mca.gov.cn//article/sj/xzqh/2020/202011/202011060901.html";
这个htnl包含很多script标签,需要循环判断一下,同时里面的url需要处理一下域名后面的双斜杠换成单斜杠,不然jsoup会报错。
for (int i=0;i
if(doc.get(i).data().contains("window.location.href=")){
s=doc.get(i).data().split("=")[1];
s=s.replace("\"","");
s=s.replace(";","");
}
}
接下来就到了真正要解析的页面了,我们要的数据同样是在table标签的tr标签里,但是当你去取的时候发现数据不全,这是因为jsoup通过get取的数据大小有限制,我们需要通过maxBodySize方法设置一下。
tr= Jsoup.connect(s).maxBodySize(Integer.MAX_VALUE)
.get()
.select("table")
.get(0)
.select("tr");
每个tr标签对应的一行数据,里面有多行的td标签
在这里插入图片描述
到这里你可能又要问了,省市区怎么区分的,看这个网页的结构,你就能看出差异,市级比省级缩进了一点,县级又比市级缩进了,通过网页源码也可以看出,省市用的td标签里的class属性值是一样的,都是class="xl7025509",但是市级比省级多了一个span标签,而县级的class属性值跟省市是不一样的,class="xl7125509",同样也有一个span标签,这样就很好区分了。
if(cityInfo.hasClass("xl7025509")){//省市
if(!cityInfo.select("span").isEmpty()){//市
}else{//省
if(cityName.endsWith("市")){
}
}
}else if(cityInfo.hasClass("xl7125509")){//区县
if(!cityInfo.select("span").isEmpty()){
}
这里要注意一下,因为四个直辖市的原因,直辖市是省级,下面直接就是县级了,可能需要自己去生成一个市级的。另外民政部在页面最后面注明了:台湾省、香港特别行政区和澳门特别行政区暂缺地市和区县信息。
到这里基本主要的逻辑就已经讲完了,代码已经上传到了我的github,这里附上Demo源码,另外根据获取的信息,我还制作了省市县的三级结构Json文件方便大家直接使用,如果有帮助到大家,希望可以给个Star,谢谢。