webmagic icon indicating copy to clipboard operation
webmagic copied to clipboard

抓取ajax渲染的页面,利用jsonPath报错,求解决方式!!!

Open dpjs opened this issue 8 years ago • 6 comments

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;

dpjs avatar Mar 04 '17 01:03 dpjs

请问下你是不是用了其他版本的JsonPath? WebMagic用的JsonPath版本比较老(0.8.1),可以用mvn dependency:tree看一下依赖版本。我这边测试是没问题的。

code4craft avatar Mar 04 '17 02:03 code4craft

用的2.2.0版本的

dpjs avatar Mar 09 '17 04:03 dpjs

2.2.0版本目前是不支持的,它有些行为跟之前设想的不一样…建议换到0.8.1试一下。

code4craft avatar Mar 09 '17 07:03 code4craft

webmagic-core(0.6.1) 默认的使用就是JsonPath(2.2.0)。。。

O-king avatar Apr 26 '17 06:04 O-king

我也发现了这个问题,我的项目使用的是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

pluone avatar Mar 30 '18 14:03 pluone

可以查看这个 #589 手动指定json-path版本可以解决问题

TonyZhang1002 avatar May 01 '20 15:05 TonyZhang1002