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();
}
}
}