HtmlParser解决查询IP所在城市问题

 

HtmlParser解决查询IP所在城市问题

 

 

1、技术目标

 

 

  • 分析IP所在城市
  • 掌握HtmlParser解析HTML内容

 

提示:本文提供HtmlParser帮助文档下载

 

2、问题描述

 

项目中要求按发送请求的用户IP分析出所在城市。完成该功能

可以自己维护一个IP数据库,该方式显然费时费力。目前网上有不少的

站点提供IP查询功能,可以使用这些站点的功能,通过HtmlParser分析

出来查询结果来实现的IP查询的需求

 

3、IP查询站点流程

 

以站点www.ip138.com为例,其IP数据库10天一更新,

 

3.1)在IP地址输入框中输入待查询的IP地址,如图:

 

 

3.2)点查询,进入查询结果页面,注意请求的URL以及参数,如图:

 

 

3.3)查询结果页面HTML代码部分,如图:

 

 

 

4、项目中导入HtmlParser库,文件如下:

 

htmllexer.jar

htmlparser.jar

 

提示:本文已提供下载

 

5、分析www.ip138.com站点的IP查询结果,代码如下:

 

 

package test;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;

public class TestIP {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		try {
			
			String ip1 = "58.253.71.109";//茂名(广东)
			String ip2 = "112.125.35.205";//北京
			String ip3 = "192.168.60.100";//局域网
			String ip4 = "211.151.135.27";//北京
			String ip5 = "61.139.76.40";//成都
			String ip6 = "218.205.252.26";//四川省 移动
			String ip7 = "222.208.168.100";//眉山(四川)
			
			//HTML解析器
			Parser parser = new Parser();
			
			//设置IP查询请求的URL以及参数
			String path = "http://www.ip138.com/ips.asp?ip=" + ip7 + "&action=2";
			parser.setURL(path);
			parser.setEncoding("GB2312");
			
			//HTML节点过滤器
			NodeFilter tableFilter = new TagNameFilter("table");//提取table标签
			NodeList tables = parser.extractAllNodesThatMatch(tableFilter);
			
			if(tables.size() < 4){//表格没有4个(提示:IP查询结果页面有4个表格)
				return;//不处理
			}
			
			//获取第3个表格(含城市信息的表格是第3个)
			TableTag table = (TableTag)tables.elementAt(2);
			
			//获取第三行(包含城市信息的行)
			TableRow row3 = table.getRow(2);
			
			//获取第三行所有列
			TableColumn[] row3cols = row3.getColumns();
			
			//取第一列的解析器(含城市信息的列)
			Parser row3ColParser = Parser.createParser(row3cols[0].getStringText(), "utf-8");;
			
			//解析出li标签
			NodeFilter liFilter = new TagNameFilter("li");//提取li标签
			NodeList liTags = row3ColParser.extractAllNodesThatMatch(liFilter);
			
			//取出第一个li标签的值
			Node node = liTags.elementAt(0);
			String value = node.getFirstChild().getText();
			System.out.println(value);
			
			if(value.indexOf("局域网") != -1){
				System.out.println("局域网");
				return;
			}
			
			if(value.indexOf("市") == -1){//没有包含市
				return;
			}
			
			//解析出城市名
			String city = value.substring(value.indexOf(":") + 1, value.indexOf("市"));
			if(city.indexOf("省") != -1){
				city = city.substring(city.indexOf("省") + 1);
			}
			System.out.println(city);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值