例如:我们知道在从网页抓取数据的时候按照某一个标签得到的数据会放到一个list里面,如图:
我们以list格式查看变量的值(除此之外还可以以txt、XML、HTML等格式查看变量的值),我们发现其中有许多空白项(经观察发现空白项是单独一个换行造成的),按照我们的初衷是想得到这样的值:在list里面按照论文题目-作者、题目-作者、题目-作者……这样的顺序存放在list里面。而现在因为一些原因导致出现了空白项,这样就不能够按照index的奇偶来顺序的将论文题目和作者一一得到。
在遇到这个问题的时候,我尝试了许多方法,例如,将list里的内容用toString()方法转成字符串然后用replace()方法替换掉其中的换行,但是发现在这样转换之后原本的多个数据项全部成为了一项,这比原来的结果还要糟糕。此外,我还尝试了用XQuery中translate()等方法依然无法达到想要的效果,这里不得不说网上关于web-harvest、xpath等资源实在是太少了,也不知是我搜索的方法不对,至少我没有在网上找到解决办法,当我想用最笨的办法用script去提取想要的内容时,突然想到一个方法,为何不可以在循环外面再定义一个变量,当抽取到有效数据的同时该变量随着自增,当读取到空白项时,该变量的值不变,这种方法是很容易想到的,如果用C、C++或者JAVA都很容易实现,但是因对XML不是很熟悉所以刚一开始不知道如何让一个变量的值循环递增,后来摸索着,终于找到了一种方法:
<!-- 定义一个变量,名字为j-->
<var-def name="j">1</var-def>
<!--重点来了!这个地方看上去是重定义变量j,但是要注意的是var-def 里overwrite属性可是不能写成false,不然就完蛋了。如果写成false那就意味着遇到同名字的变量原来变量的值不覆盖,这样的话template的值永远都停留为1,while就成死循环了。将overwrite属性值写为true(默认为true,所以可以不写),则在每次执行template的时候原来j的值都会被覆盖为新的值,就像是C中的j++,便可实现递增-->
<while condition='${!j.toString().equals("5")}'>
<var-def name="j" >
<template>${j=Integer.parseInt(j.toString())+1}</template>
</var-def>
</while>
有了这个办法之后就可以配合着case语句判断index的奇偶性,实现想要的功能。