webmagic icon indicating copy to clipboard operation
webmagic copied to clipboard

xpath not contains support

Open freshgeek opened this issue 5 years ago • 1 comments

在 xpath 中 使用not contains 语法不支持 不知道有没有什么办法解决,在xsoup 0.3.1版本中的源码中 不支持,可以添加支持或者有其他方法吗 eg: xpath "//*[@class='mod-play-list']/li[not(contains(@class,'item-hold')]/a"

org.jsoup.select.Selector$SelectorParseException: Could not parse query 'li[not(contains(@class,'item-hold')]': unexpected token at 'not(contains(@class,'item-hold')' at us.codecraft.xsoup.xevaluator.XPathParser.byFunction(XPathParser.java:260) at us.codecraft.xsoup.xevaluator.XPathParser.consumePredicates(XPathParser.java:231) at us.codecraft.xsoup.xevaluator.XPathParser.findElements(XPathParser.java:163) at us.codecraft.xsoup.xevaluator.XPathParser.parse(XPathParser.java:76) at us.codecraft.xsoup.xevaluator.XPathParser.parse(XPathParser.java:408) at us.codecraft.xsoup.xevaluator.XPathParser.combinator(XPathParser.java:110) at us.codecraft.xsoup.xevaluator.XPathParser.parse(XPathParser.java:74) at us.codecraft.xsoup.xevaluator.XPathParser.parse(XPathParser.java:408) at us.codecraft.xsoup.Xsoup.compile(Xsoup.java:25) at us.codecraft.webmagic.selector.XpathSelector.(XpathSelector.java:21) at us.codecraft.webmagic.selector.Selectors.xpath(Selectors.java:32) at us.codecraft.webmagic.selector.HtmlNode.xpath(HtmlNode.java:42) at com.example.videoparse.spider.yk.YoukuParse.process(YoukuParse.java:37) at us.codecraft.webmagic.Spider.onDownloadSuccess(Spider.java:414) at us.codecraft.webmagic.Spider.processRequest(Spider.java:406) at us.codecraft.webmagic.Spider.access$000(Spider.java:61) at us.codecraft.webmagic.Spider$1.run(Spider.java:320) at us.codecraft.webmagic.thread.CountableThreadPool$1.run(CountableThreadPool.java:74) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)


    private static final Map<String, FunctionEvaluator> FUNCTION_MAPPING = new HashMap<String, FunctionEvaluator>();
    static {
        FUNCTION_MAPPING.put("contains", new FunctionEvaluator() {
            @Override
            public Evaluator call(String... param) {
                Validate.isTrue(param.length == 2, String.format("Error argument of %s", "contains"));
                return new Evaluator.AttributeWithValueContaining(param[0], param[1]);
            }
        });
        FUNCTION_MAPPING.put("starts-with", new FunctionEvaluator() {
            @Override
            public Evaluator call(String... param) {
                Validate.isTrue(param.length == 2, String.format("Error argument of %s", "starts-with"));
                return new Evaluator.AttributeWithValueStarting(param[0], param[1]);
            }
        });
        FUNCTION_MAPPING.put("ends-with", new FunctionEvaluator() {
            @Override
            public Evaluator call(String... param) {
                Validate.isTrue(param.length == 2, String.format("Error argument of %s", "ends-with"));
                return new Evaluator.AttributeWithValueEnding(param[0], param[1]);
            }
        });
    }

freshgeek avatar Jan 12 '20 13:01 freshgeek

我也遇到相同问题,但是没找到好的解决办法

hhh123-sec avatar Sep 21 '20 08:09 hhh123-sec