zoukankan      html  css  js  c++  java
  • jsoup 使用总结4--高级用法之 script js 脚本

    jsoup 使用总结4--高级用法之 script js 脚本

    大部分时候,我们使用jsoup解析网页的时候,都是直接找到某一类元素,或者按某种selector查询;具体使用方法可以参考jsoup官网文档
    那么你有没有实际操作过,查找script js 脚本呢,因为很多时候页面的内容是根据js动态生成的,或者数据是动态变更;那么这个时候,我们只是获取html页面中script js脚本之间的内容。

    部分html代码:

    <div class="example_row">
        <a href="http://www.example.com/news.html" target="_blank">真相</a></h3>
        <a href="http://www.example.com/news/cat/13" target="_blank">今日头条</a>
        <a href="http://www.example.com/news/cat/16" target="_blank">各地新闻</a>
        <a href="http://www.example.com/news/cat/14" target="_blank">行业报告</a>
        <a href="http://www.example.com/news/cat/15" target="_blank">政府政策</a>
        <a href="http://www.example.com/news/cat/18" target="_blank">疾病防护</a>
        <a href="http://www.example.com/news/cat/20" target="_blank">科普</a>
    </div>
    ....
    <script type="text/javascript">
        var result = {key1:value1, key2:value2 ...}
    </script>
    

    java代码:

    Document doc = Jsoup.connect("www.example.com").timeout(0).get();
    Elements links = doc.select("div.example_row").select("a");
    for(Element link : links)
    {
       String linkHref = link.attr("href"); 
       String linkText = link.text();
       ...
    }
    Element link = doc.select("a").first();
    Element link_2 = doc.select("a").last();
    

    上面的方式就可以帮我们查找到js 中的数据。

    还有一种我在实际工作中遇到的情况, js 很复杂,并不像上面的那么一下子就可以catch到:
    html代码:

    <script type="text/javascript">
         var result = {key1:value1, key2:value2 ...}
         var option_1 = {
    color: ['#79b05f', '#e58c65'],
    tooltip : {
        trigger: 'change'
    },
    legend: {
        data:['标准1','标准2']
    },
    xchange : [
        {
            type : 'category',
            boundaryGap : false,
            data : ["22u65e501u65f6","22u65e502u65f6","22u65e502u65f6","22u65e503u65f6","22u65e503u65f6","22u65e504u65f6","22u65e504u65f6","22u65e505u65f6","22u65e505u65f6","22u65e506u65f6","22u65e506u65f6","22u65e507u65f6","22u65e507u65f6","22u65e508u65f6","22u65e508u65f6","22u65e509u65f6","22u65e509u65f6","22u65e58u65f6","22u65e58u65f6","22u65e511u65f6","22u65e511u65f6","22u65e512u65f6","22u65e512u65f6","22u65e513u65f6"],
            changeLine: {
              lineStyle : {
                color: '#d4d4d4'
              }
            }
        }
    ],
    ychange : [
        {
            type : 'value',
            changeLabel : {
                formatter: '{value}'
            },
            changeLine: {
              lineStyle : {
                color: '#d4d4d4'
              }
            }
        }
    ],
    series : [
        {
            name:'标准1',
            type:'line',
            data:[37,37,37,162,162,167,167,40,40,44,44,46,46,48,48,47,47,166,166,39,39,38,38,163]          },
        {
            name:'标准2',
            type:'line',
            data:[83,84,84,12,12,124,124,132,132,20,20,24,24,28,28,25,25,123,123,88,88,85,85,2]          }
    ]
    };
    ...
         
    </script>
    

    那么针对这种情况jsoup如何破解呢,享受在jsoup的便捷中,思考,搜索,仍然误解;
    发现这种问题jsoup还真解决不了。
    那就换正则表达式试试。这里推荐一个在线正则工具 regexr
    换了正则,然后不停的try,终于ok了:
    java 代码:

    Document doc = Jsoup.connect("www.example.com").timeout(0).get();
    Elements scripts = doc.select("script");
    for(Element script : scripts)
    {
       if(script.html().contains("var option_1 =")) //注意这里一定是html(), 而不是text()
       {
    	  String str = data.html().replace("
    ", ""); //这里是为了解决 无法多行匹配的问题
    	  String pattern = "var option_1 = \{(.*?)\};"; //()必须加,
    
    	  Pattern r = Pattern.compile(pattern,Pattern.MULTILINE);// Pattern.MULTILINE 好像没有什么用,所以才使用上面的replace
    	  Matcher m = r.matcher(str);
    	  if(m.find())
    	  {
    		String option_1 = m.group();
    		option_h24 = option_h24.replace("var option_1 = ", "");
    		JSONObject json = new JSONObject(option_1);
    	     ...
          }
       }
       ...
    }
    

    希望能解决你手边的问题。

    另外推荐阅读jsoup的官网文档,我80%的问题都在官网找到了方法。

  • 相关阅读:
    [转]23种经典设计模式的java实现_5_职责链模式
    ARM汇编伪指令介绍
    avrstudio 5 按键控制led移位
    linux 应用程序里面调用shell
    avrstudio 5 同时点亮8只数码管
    从Linux程序中执行shell(程序、脚本)并获得输出结果(转)
    avrstudio 5 矩阵键盘
    linux 格式化输出输入函数
    Google 浏览器(2011)书签同步
    linux下面的路径问题
  • 原文地址:https://www.cnblogs.com/jerrychen/p/4667320.html
Copyright © 2011-2022 走看看