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 : ["22\u65e501\u65f6","22\u65e502\u65f6","22\u65e502\u65f6","22\u65e503\u65f6","22\u65e503\u65f6","22\u65e504\u65f6","22\u65e504\u65f6","22\u65e505\u65f6","22\u65e505\u65f6","22\u65e506\u65f6","22\u65e506\u65f6","22\u65e507\u65f6","22\u65e507\u65f6","22\u65e508\u65f6","22\u65e508\u65f6","22\u65e509\u65f6","22\u65e509\u65f6","22\u65e58\u65f6","22\u65e58\u65f6","22\u65e511\u65f6","22\u65e511\u65f6","22\u65e512\u65f6","22\u65e512\u65f6","22\u65e513\u65f6"],
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("\n", ""); //这里是为了解决 无法多行匹配的问题
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%的问题都在官网找到了方法。

jsoup 使用总结4--高级用法之 script js 脚本的更多相关文章

  1. Fiddler 高级用法:Fiddler Script 与 HTTP 断点调试

    转载自 https://my.oschina.net/leejun2005/blog/399108 1.Fiddler Script 1.1 Fiddler Script简介 在web前端开发的过程中 ...

  2. Jquery remove 高级用法

    Jquery remove 高级用法 html 代码 <div class="file-image">abc1111</div><div class= ...

  3. nmap命令-----高级用法

    探测主机存活常用方式 (1)-sP :进行ping扫描 打印出对ping扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测):  下面去扫描10.0.3.0/24这个网段的的主机 nmap ...

  4. Jenkins高级用法 - Jenkinsfile 介绍及实战经验

    系列目录 1.Jenkins 安装 2.Jenkins 集群 3.Jenkins 持续集成 - ASP.NET Core 持续集成(Docker&自由风格&Jenkinsfile) 4 ...

  5. Linux之shell脚本for、while、case语句的高级用法

    1.case语句的用法: [root@ELK-chaofeng test]# cat test3.sh #!/bin/bash while true ;do read -p "please ...

  6. jquery ajax实例教程和一些高级用法

    jquery ajax的调用方式:jquery.ajax(url,[settings]),jquery ajax常用参数:红色标记参数几乎每个ajax请求都会用到这几个参数,本文将介绍更多jquery ...

  7. SQL server 存储过程 C#调用Windows CMD命令并返回输出结果 Mysql删除重复数据保留最小的id C# 取字符串中间文本 取字符串左边 取字符串右边 C# JSON格式数据高级用法

    create proc insertLog@Title nvarchar(50),@Contents nvarchar(max),@UserId int,@CreateTime datetimeasi ...

  8. 爬虫—Requests高级用法

    Requests高级用法 1.文件上传 我们知道requests可以模拟提交一些数据.假如有的网站需要上传文件,我们也可以用requests来实现. import requests files = { ...

  9. Go template高级用法、深入详解、手册、指南、剖析

    入门示例 以下为test.html文件的内容,里面使用了一个template语法{{.}}. <!DOCTYPE html> <html> <head> <m ...

随机推荐

  1. LAPACK的C/C++接口及代码实例

    今天介绍一个矩阵处理工具LAPACK,她有C\C++接口,可在windows下移植.本人最近正在学习,发现还是还不错滴~ 本博文分为三部分,第一部分介绍LAPACK的安装,这里只介绍最简单的部署:第二 ...

  2. Ext JS 6应用程序Build后出现“c is not a constructor return new c(a[0])”的处理

    概述 在对Ext JS 6的应用程序打包后,时不时会出现以下错误: 由于是压缩后出现的错误,要进行调试也无从下手,因而这个错误会令新手手足无措,不知道是怎么回事. 错误原因 造成该错误的主要原因是要创 ...

  3. Swift基础之实现下拉变大和OC下拉变大上拉缩小Demo

    Swift语言实现下拉变大效果:(上拉缩小效果随后研究......) 关键代码:方法一: self.automaticallyAdjustsScrollViewInsets = false;      ...

  4. 【一天一道LeetCode】#72. Edit Distance

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...

  5. Java应用服务器Resin

    Resin是CAUCHO公司(http://www.caucho.com/)的产品,是一个非常流行的支持servlets 和jsp的引擎,速度非常快.Resin本身包含了一个支持HTTP/1.1的WE ...

  6. linux 下检查java jar包 程序是否正常 shell

    linux 下检查java jar包 程序是否正常 shell http://injavawetrust.iteye.com BATCH_SERVER="batch.jar" NR ...

  7. 文件I/O实践(3) --文件共享与fcntl

    文件共享 一个进程打开了两个文件 文件表条目(file-table-entry): 1.文件状态标志(file-status-flags): 读/写/追加/同步/非阻塞等; 2.当前文件偏移量 3.v ...

  8. Android的内存分配与回收

    想写一篇关于android的内存分配和回收文章的想法来源于追查一个魅族手机图片滑动卡顿问题,我们想了很多办法还是没有避免他不停的GC,所以就打算详细的看看内存分配和GC的原理,为什么会不断的GC,GC ...

  9. 浅析GDAL库C#版本支持中文路径问题

    GDAL库对于C#的支持问题还是蛮多的,对于中文路径的支持就是其中之一(另一个就是通过OGR库获取图形的坐标信息). 关于C#支持中文路径,看过我之前博客的应该都不陌生,如果使用的是我修改过的GDAL ...

  10. Android LruCache技术原理

    概述 记得在很早之前,我有写过一篇文章Android高效加载大图.多图解决方案,有效避免程序OOM,这篇文章是翻译自Android Doc的,其中防止多图OOM的核心解决思路就是使用LruCache技 ...