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. 最简单的基于FFmpeg的AVfilter例子(水印叠加)

    ===================================================== 最简单的基于FFmpeg的AVfilter例子系列文章: 最简单的基于FFmpeg的AVfi ...

  2. html倒计时代码

    <SPAN id=span_dt_dt></SPAN> <SCRIPT language=javascript> <!-- //document.write( ...

  3. Dynamics CRM 2013 subgrid刷新后刷新主表单

    项目中会遇到这样的需求,会根据subgrid中的数据变化去更新主表单中的某个或多个字段值,一般的做法就是写插件根据subgrid中实体数据的变化在后台更新主表数据库,但后台更新了要反映到前台就得使用刷 ...

  4. python的str()和repr()的区别

    str()一般是将数值转成字符串. repr()是将一个对象转成字符串显示,注意只是显示用,有些对象转成字符串没有直接的意思.如list,dict使用str()是无效的,但使用repr可以,这是为了看 ...

  5. 从Linux启动过程到android启动过程

    Linux启动过程: 1.首先开机给系统供电,此时硬件电路会产生一个确定的复位时序,保证cpu是最后一个被复位的器件.为什么cpu要最后被复位呢?因为 如果cpu第一个被复位,则当cpu复位后开始运行 ...

  6. 【Unity Shaders】Using Textures for Effects —— 实现Photoshop的色阶效果

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  7. ubuntu 开发环境配置及安装 nodejs

    ubuntu 开发环境配置及安装 nodejs 1 安装nodejs $ sudo apt-get install build-essential $ sudo apt-get install gcc ...

  8. 视音频编解码学习工程:JPEG分析器

    =====================================================视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习工 ...

  9. javascript语法之for-in语句

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Mac下ImageMagick安装(libpng)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/42562705 ...