最近项目需要,研究了很久的jsoup。做个小小的总结:
首先说一下jsoup是非常强大的。最常用的select(xxx[xxx~=regx])可以选择内容是某种格式的属性的某种标签。这里可以用正则表达式的。
还有一个用的很少的,而且说明文档不清楚的::eq(n),:lt(n),:gt(n)这三个伪命令。n为位置序号,当前ele的下属的第一个位置的序号是0,然后1,2。。。类推。
还有一个直接孩子的符号〉,一般来说都是用AA BB来表示AA的BB子标签。用AA 〉 BB表示直接孩子。
然后说一下jsoup解决网页编码问题:
jsoup的parser方法可以传入很多种参数,可以是Url,(String,charset),(file,charset),jsoup在parser的时候必须知道网页字符集编码,用如下方式得到:
-
public static String matchCharset(String content) {
-
String chs = "gb2312";
-
Pattern p = Pattern.compile("(?<=charset=)(.+)(?=\")");
-
Matcher m = p.matcher(content);
-
if (m.find())
-
return m.group();
-
return chs;
-
}
-
/**
-
* 获得字符集
-
*/
-
public static String getCharset (File input) throws Exception{
-
Document doc = Jsoup.parse(input,"utf-8");
-
Elements eles = doc.select("meta[http-equiv=Content-Type]");
-
Iterator<Element> itor = eles.iterator();
-
while (itor.hasNext())
-
return matchCharset(itor.next().toString());
-
return "gb2312";
-
}
但是jsoup对网页中 处理以后得到的是无法trim掉的asc空白码,要用content=content.replace(Jsoup.parse(" ").text(),"");去掉。这条命令能同时解决 显示为???的问题。
下面这个方法只对部分编码环境有效:
content = new String(content.getBytes()).replace("?","").replace(" ","")
因为只有部分环境才会把无法解码的单元用?表示。
最后记录一下匹配基本所有常用数形的正则表达式:
(^[-+]?[1-9]\\d*(\\.[0-9]+)?$)|([1-9]\\d*(,\\d{3})*)
阅读(2508) | 评论(0) | 转发(0) |