jsoup使⽤总结4--⾼级⽤法之scriptjs脚本
jsoup 使⽤总结4--⾼级⽤法之 script js 脚本
⼤部分时候,我们使⽤jsoup解析⽹页的时候,都是直接到某⼀类元素,或者按某种selector查询;具体使⽤⽅法可以参考官⽹⽂档
那么你有没有实际操作过,查script js 脚本呢,因为很多时候页⾯的内容是根据js动态⽣成的,或者数据是动态变更;那么这个时候,我们只是获取html页⾯中script js脚本之
间的内容。
部分html代码:
<div class="example_row">
<a href="ample/news.html" target="_blank">真相</a></h3>
<a href="ample/news/cat/13" target="_blank">今⽇头条</a>
<a href="ample/news/cat/16" target="_blank">各地新闻</a>
<a href="ample/news/cat/14" target="_blank">⾏业报告</a>
<a href="ample/news/cat/15" target="_blank">政府政策</a>
<a href="ample/news/cat/18" target="_blank">疾病防护</a>
<a href="ample/news/cat/20" target="_blank">科普</a>
</div>
....
<script type="text/javascript">
var result = {key1:value1, key2:value2 ...}
</script>
java代码:
Document doc = t("ample").timeout(0).get();
Elements links = doc.select("ample_row").select("a");
for(Element link : links)
{
String linkHref = link.attr("href");
String linkText = ();
...
}
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\u65e5 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还真解决不了。
那就换正则表达式试试。这⾥推荐⼀个在线正则⼯具
换了正则,然后不停的try,终于ok了:
java 代码:
Document doc = t("ample").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 = Patternpile(pattern,Pattern.MULTILINE);// Pattern.MULTILINE 好像没有什么⽤,所以才使⽤上⾯的replace
Matcher m = r.matcher(str);
if(m.find())
{
String option_1 = m.group();js脚本开发
option_h24 = place("var option_1 = ", "");
JSONObject json = new JSONObject(option_1);
...
}
}
...
}
希望能解决你⼿边的问题。
另外推荐阅读的官⽹⽂档,我80%的问题都在官⽹到了⽅法。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论