抓取ajax渲染的页面,利用jsonPath报错,求解决方式!!!
Exception in thread "pool-1-thread-1" java.lang.NoSuchMethodError: com.jayway.jsonpath.JsonPath.compile(Ljava/lang/String;[Lcom/jayway/jsonpath/Filter;)Lcom/jayway/jsonpath/JsonPath;
请问下你是不是用了其他版本的JsonPath? WebMagic用的JsonPath版本比较老(0.8.1),可以用mvn dependency:tree看一下依赖版本。我这边测试是没问题的。
用的2.2.0版本的
2.2.0版本目前是不支持的,它有些行为跟之前设想的不一样…建议换到0.8.1试一下。
webmagic-core(0.6.1) 默认的使用就是JsonPath(2.2.0)。。。
我也发现了这个问题,我的项目使用的是0.5.3,这个项目的json-path的依赖版本是2.2.0,经过分析是你们项目maven仓库中的jar包有错误
调用的伪代码如下:
class FooProcessor implements PageProcessor {
@Override
public void process(Page page) {
Json json = page.getJson();
json.jsonPath("$.json_path");//这一行代码报错
}
}
错误信息如下:
Exception in thread "pool-1-thread-1" java.lang.NoSuchMethodError: com.jayway.jsonpath.JsonPath.compile(Ljava/lang/String;[Lcom/jayway/jsonpath/Filter;)Lcom/jayway/jsonpath/JsonPath;
at us.codecraft.webmagic.selector.JsonPathSelector.<init>(JsonPathSelector.java:23)
at us.codecraft.webmagic.selector.Json.jsonPath(Json.java:54)
我是用classpy(一款字节码查看工具)查看了us.codecraft.webmagic.selector.JsonPathSelector.class发现class文件中调用JsonPath.compile(this.jsonPathStr);的字节码是com.jayway.jsonpath.JsonPath.compile(Ljava/lang/String;[Lcom/jayway/jsonpath/Filter;)Lcom/jayway/jsonpath/JsonPath;
而JsonPah.compile方法签名的字节码是com.jayway.jsonpath.JsonPath.compile(Ljava/lang/String;[Lcom/jayway/jsonpath/Predicate;)Lcom/jayway/jsonpath/JsonPath;,这两个签名中第二个参数的类型是不一致的,显然JsonPathSelector里的生成的字节码类型是错误的
经过测试发现0.6.1版本也有这个问题
mvn dependency:tree | grep jsonpath -C 10查看json-path版本号
[INFO] +- us.codecraft:webmagic-core:jar:0.5.3:compile
[INFO] | +- com.google.guava:guava:jar:18.0:compile
[INFO] | +- us.codecraft:xsoup:jar:0.3.1:compile
[INFO] | | \- org.assertj:assertj-core:jar:2.5.0:compile
[INFO] | +- org.slf4j:slf4j-api:jar:1.7.21:compile
[INFO] | +- org.slf4j:slf4j-log4j12:jar:1.7.21:compile
[INFO] | | \- log4j:log4j:jar:1.2.17:compile
[INFO] | +- commons-collections:commons-collections:jar:3.2.2:compile
[INFO] | +- org.jsoup:jsoup:jar:1.8.3:compile
[INFO] | +- com.jayway.jsonpath:json-path:jar:2.2.0:compile
[INFO] | | \- net.minidev:json-smart:jar:2.2.1:compile
[INFO] | | \- net.minidev:accessors-smart:jar:1.1:compile
[INFO] | | \- org.ow2.asm:asm:jar:5.0.3:compile
[INFO] | \- com.alibaba:fastjson:jar:1.1.37:compile
[INFO] +- us.codecraft:webmagic-extension:jar:0.5.3:compile
可以查看这个 #589 手动指定json-path版本可以解决问题