好友
阅读权限 20
听众
最后登录 1970-1-1
星空漫步
发表于 2020-7-29 09:24
本帖最后由 LIN168168 于 2020-7-29 09:25 编辑
公司开发一个项目,需要行政区划编码,所以自己写了一份代码去民政部爬取,至于为什么不用python,当然是因为我不会了。。。
根据民政部行政区划,初始化省市区编码
url 改为最新的行政区划网址就可以 运行RegionCode 的main方法
编码规则
省 2位
市 4位
区 6位
二级编码缺少
1.直辖市 增加与省同名的市
2.省直辖县级行政区划 增加名字为省直辖县级行政区划的市
三级编码缺少
增加与市同名的区
港澳台
增加港澳台同名的市和区
/**
* 使用 Jsoup 采集民政部行政区划编码
*
* @AuThor : xxx
* @date : 2020/7/2
*/
public class RegionCode {
public static void main(String[] args) throws IOException {
// 民政部行政区划编码地址
String url = "http://www.mca.gov.cn/article/sj/xzqh/2020/2020/202003301019.html";
Document doc = Jsoup.connect(url).maxBodySize(0).timeout(100000).get();
Elements trs = doc.select("tr");
List<Code> codes = new ArrayList<>();
for (Element tr : trs) {
Elements tds = tr.select("td");
if (tds.size() > 3) {
String regionCode = tds.get(1).text();
String regionArea = tds.get(2).text();
String parentCode = "";
if (validCode(regionCode)) {
int level;
if (!regionCode.endsWith("00")) {
level = 3;
parentCode = regionCode.substring(0, 4);
} else if (regionCode.endsWith("0000")) {
level = 1;
parentCode = "0";
regionCode = regionCode.substring(0, 2);
} else {
level = 2;
parentCode = regionCode.substring(0, 2);
regionCode = regionCode.substring(0, 4);
}
codes.add(new Code(regionCode, regionArea, parentCode, level));
}
}
}
make(codes);
System.out.println("总数量为:" + codes.size());
codes.sort(Comparator.comparing(Code::getRegionCode));
codes.forEach(code -> {
//自己拼接sql语句
String content =
"insert into xxx";
System.out.println(content);
});
}
/**
* 判断是否是行政编码
*
* @Param code
* @return
*/
public static boolean validCode(String code) {
try {
Integer.parseInt(code);
return true;
} catch (Exception e) {
return false;
}
}
/**
* 数据清洗
*
* @param codes
* @return
*/
public static List<Code> make(List<Code> codes) {
List<Code> level2Codes = new ArrayList<>();
List<Code> level3Codes = new ArrayList<>();
Set<String> defect = new HashSet<>();
for (Code code : codes) {
String parentCode = code.getParentCode();
String regionCode = code.getRegionCode();
Integer level = code.getLevel();
boolean level2exits = false;
boolean level3exits = false;
for (Code code2 : codes) {
if (parentCode.equals(code2.getRegionCode())) {
level2exits = true;
}
if (regionCode.equals(code2.getParentCode())) {
level3exits = true;
}
}
// 二级行政编码缺少
if (!level2exits && level != 1) {
defect.add(parentCode);
}
// 三级行政编码缺少,自动补齐同名市级为第三级
if (!level3exits && level == 2) {
level3Codes.add(new Code(regionCode + "00", code.getRegionArea(), regionCode, 3));
}
}
for (String s : defect) {
// 后缀为1 为直辖市
if (s.endsWith("1")) {
for (Code code : codes) {
if (s.substring(0, 2).equals(code.getRegionCode())) {
level2Codes.add(new Code(s, code.getRegionArea(), s.substring(0, 2), 2));
break;
}
}
} else {
level2Codes.add(new Code(s, "省直辖县级行政区划", s.substring(0, 2), 2));
}
}
codes.addAll(level2Codes);
codes.addAll(level3Codes);
// 港澳台增加编码 三级下拉框对齐
codes.add(new Code("7100", "台湾省", "71", 2));
codes.add(new Code("710000", "台湾省", "7100", 3));
codes.add(new Code("8100", "香港特别行政区", "81", 2));
codes.add(new Code("810000", "香港特别行政区", "8100", 3));
codes.add(new Code("8200", "澳门特别行政区", "82", 2));
codes.add(new Code("820000", "澳门特别行政区", "8200", 3));
return codes;
}
}
public class Code {
private String regionCode;
private String regionArea;
private String parentCode;
private Integer level;
}
注释写的我还是挺全的,直接运行main方法就可以了,下次自己用python在写一次:lol
免费评分
参与人数 1 吾爱币 +5
热心值 +1
收起
理由
苏紫方璇
+ 5
+ 1
感谢发布原创作品,吾爱破解论坛因你更精彩!
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。