zoukankan      html  css  js  c++  java
  • 一个文字都用实体编码的奇葩网站

    看到一个奇葩的网站,页面上的文字都是使用html实体编码了的(很久之前看的,现在改版了,只有固定部分是html实体编码了):

    view-source:http://www.gzthfy.gov.cn/pa2/wel_bgt2.seam?zxbh=20140110180053&cid=9057

    解码如下:

    package cc11001100.misc.crawler.misc.tianhefayuan;
    
    /**
     * 这个网站,全站都是这种见鬼的编码
     * <p>
     * http://www.gzthfy.gov.cn
     * <p>
     * 参考资料:
     * 1. https://www.jianshu.com/p/6dcefb2a59b2
     * <p>
     * 可以直接当做html来解析,但还是自己写一个解析
     * <p>
     * 使用Apache Commons工具包下的工具类就可以直接解码
     * StringEscapeUtils.unescapeHtml4
     *
     * @author CC11001100
     */
    public class TianhefayuanCrawler {
    
    	private static String convertToReadable(String rawContent) {
    		// 直接调库实现
    //        return StringEscapeUtils.unescapeHtml4(rawContent);
    
    		// 不能满足于做一个碉堡侠,还是自己实现一下
    		StringBuilder sb = new StringBuilder();
    		boolean isInHtmlEncode = false;
    		int lastHtmlEncodeBeginIndex = -1;
    		for (int i = 0; i < rawContent.length(); i++) {
    			if (isInHtmlEncode) {
    				if (rawContent.charAt(i) != ';') {
    					// 仍然在实体编码中,直接略过下一个
    					continue;
    				} else {
    					// 一个实体编码已经结束了,解析出它
    					isInHtmlEncode = false;
    					// 略过html实体前面的"&#"部分
    					String encodeNumStr = rawContent.substring(lastHtmlEncodeBeginIndex + 2, i);
    					int radix = 10;
    					if (encodeNumStr.charAt(0) == 'x' || encodeNumStr.charAt(0) == 'X') {
    						radix = 16;
    						encodeNumStr = encodeNumStr.substring(1);
    					} else if (encodeNumStr.startsWith("0")) {
    						radix = 8;
    						encodeNumStr = encodeNumStr.substring(1);
    					}
    					sb.append((char) Integer.parseInt(encodeNumStr, radix));
    				}
    			} else if (nextIsHtmlEncode(rawContent, i)) {
    				isInHtmlEncode = true;
    				lastHtmlEncodeBeginIndex = i;
    			} else {
    				sb.append(rawContent.charAt(i));
    			}
    		}
    		return sb.toString();
    	}
    
    	private static boolean nextIsHtmlEncode(String s, int index) {
    		return s.length() > index + 1 && (s.charAt(index) == '&' && s.charAt(index + 1) == '#');
    	}
    
    	public static void main(String[] args) {
    		String rawContent = "广州市天河区人民法院";
    		System.out.println(convertToReadable(rawContent)); // 广州市天河区人民法院
    	}
    
    }


    请注意爬虫文章具有时效性,本文写于2019年7月份,于整理存稿时发布。

  • 相关阅读:
    VMware安装CentOS系统与配置全过程
    Matplotlib学习笔记
    python正则表达式字符记录
    HyperLedger Fabric 学习思路分享
    fabric-sdk-container v1.0-beta 新增支持多服务节点
    HyperLedger/Fabric SDK使用Docker容器镜像快速部署上线
    HyperLedger/Fabric JAVA-SDK with 1.1
    HyperLedger Fabric 1.1 手动部署单机单节点
    Hyperledger Fabric CA User’s Guide——配置设置(四)
    Hyperledger Fabric CA User’s Guide——开始(三)
  • 原文地址:https://www.cnblogs.com/cc11001100/p/14037743.html
Copyright © 2011-2022 走看看