由于对xquery的语法不熟悉,导致debug折腾了两个晚上。遇到的问题基本可归纳成以下几点:
1. 中文字符编码问题
在抓取中文网页时,以下几个地方需要指定charset属性,否则会出现奇怪的错误
<?xml version="1.0" encoding="gb2312"?>
<file action="write" path="../data/plots.xml" charset="gb2312">
<http url="${sys.fullUrl(plot_top_url, url_plot)}" charset="gb2312"/>
2. xquery参数引用问题
引用外部的参数需要使用命名空间
declare variable $url as xs:string external;
另外,在写xquery过程中有两个FireBug工具可以使用:XPather, XqUSEme
XQuery教程
http://www.w3schools.com/xpath/xpath_functions.asp
3. 字符编码问题
当使用java -jar命令行参数执行时,如果配置文件里有中文字符,可能会出现XML解析出乱码。这是因为有一个全局配置参数,用来指定加载XML文件时的字符编码。可打开webHarvest窗口程序,在Execution->Setting菜单中设置File Enconding=GB2312,然后命令行运行就一切正常了。
4. 使用Kitchen调用函数时包含中文参数
当在脚本部署时使用Kitchen调用,脚本中引用到其它脚本文件里的函数,并且传递参数中出现中文字符时, 中文字符在编码时会出现问题,影响脚本的正常功能逻辑运行. 比如, 在一个脚本中调用common-function.xml里的download-multipage-list函数, 在调用时nextLinkUrl参数包含了中文'下一页', 使用kitchen发现有问题, 而在spoon中执行确是正常的. 这种情况下应当避免使用中文参数, 可改成其它xpath表达式.
以下是sample代码:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Expects following initial variable:
search - search expression
-->
<config charset="UTF-8">
<include path="common-functions.xml"/>
<!-- defines search keyword and start URL -->
<var-def name="search" overwrite="false">地球</var-def>
<var-def name="url">
<xpath expression="//noscript//a/@href[1]">
<html-to-xml>
<http url="http://images.google.com/images?q=地球&hl=en&btnG=Search+Images&biw=1280&bih=602"/>
</html-to-xml>
</xpath>
</var-def>
<!-- collects all image URLs -->
<var-def name="imgLinks">
<call name="download-multipage-list">
<call-param name="pageUrl"><var name="url"/></call-param>
<call-param name="nextXPath">//td[.='Next']/a/@href</call-param>
<call-param name="itemXPath">//img[contains(@src, 'images?q=tbn')]/@src</call-param>
<call-param name="maxloops">5</call-param>
</call>
</var-def>
<!-- download images and saves them to the files -->
<loop item="link" index="i" filter="unique">
<list>
<var name="imgLinks"/>
</list>
<body>
<file action="write" type="binary" path="google_images/${search}_${i}.gif">
<http url="${sys.fullUrl(url, link)}"/>
</file>
</body>
</loop>
</config>