使用Xpath提取网页元素

发布于 2021-12-09 04:56:37 字数 252 浏览 784 评论 9

@黄亿华 你好,想跟你请教个问题:

使用您的webmagic,在用Xpath选取页面元素时,选取不到。

描述:在CSS网页布局的网页中,使用是正常的,但是遇到使用表格进行网页布局的网站,再使用Xpath去页面元素,就取不回来了。


如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

高跟鞋的旋律 2021-12-10 02:57:21

你可以用HtmlCleaner来试下是否支持
siblingsindex。Spider.xsoupOff()

残花月 2021-12-10 02:57:20


@黄亿华

我 读过你的代码,包括你学习jsoup的文档,我对jsoup整体还是不太清楚。xsoup 是对jsoup的二次封装,jsoup node中有个siblingsindex属性,能不能封装下 Evaluator.IndexEquals来实现 “page.getHtml().xpath("/html/body/table[5]/tbody/tr/td[3]/table/tbody /tr[2]/td[1]/table/tbody/tr/td/a").links().all();”这种方式获取数据?

疑心病 2021-12-10 02:57:09

@黄亿华

webmagic支持“/div[@class='Question']//div[@class='Content']/div[@class='detail']”,怎么不支持“page.getHtml().xpath("/html/body/table[5]/tbody/tr/td[3]/table/tbody/tr[2]/td[1]/table/tbody/tr/td/a").links().all();”这种方式?

在xpathparser中:

    private void findElements() {

        if (tq.matches("@")) {

            consumeAttribute();

        } else if (tq.matches("*")) {

            allElements();

        } else if (tq.matchesRegex("\w+\(.*\)")) {

            consumeFunction();

        } else if (tq.matchesWord()) {

            byTag();

        } else if (tq.matches("[@")) {

            byAttribute();

        } else if (tq.matchesRegex("\[\d+\]")) {

            byNth();

        } else {

            // unhandled

            throw new Selector.SelectorParseException("Could not parse query '%s': unexpected token at '%s'", query, tq.remainder());

        }

    }

其中的“tq.matchesRegex("\[\d+\]")”不是对例如“table[5]”这种方式处理了,怎么不可以用?

永不分离 2021-12-10 02:56:02

webmagic支持“/div[@class='Question']//div[@class='Content']/div[@class='detail']”,怎么不支持“page.getHtml().xpath("/html/body/table[5]/tbody/tr/td[3]/table/tbody/tr[2]/td[1]/table/tbody/tr/td/a").links().all();”这种方式?

在xpathparser中:

    private void findElements() {

        if (tq.matches("@")) {

            consumeAttribute();

        } else if (tq.matches("*")) {

            allElements();

        } else if (tq.matchesRegex("\w+\(.*\)")) {

            consumeFunction();

        } else if (tq.matchesWord()) {

            byTag();

        } else if (tq.matches("[@")) {

            byAttribute();

        } else if (tq.matchesRegex("\[\d+\]")) {

            byNth();

        } else {

            // unhandled

            throw new Selector.SelectorParseException("Could not parse query '%s': unexpected token at '%s'", query, tq.remainder());

        }

    }

其中的“tq.matchesRegex("\[\d+\]")”不是对例如“table[5]”这种方式处理了,怎么不可以用?

奢望 2021-12-10 02:54:29
虐人心 2021-12-10 02:47:21

没问题的呀-.-肯定是你输入的表达式不对

输什么也不输骨气 2021-12-10 02:42:20

@黄亿华 ,谢谢您的回答。

蓝颜夕 2021-12-09 23:36:19

表格布局的话,xpath只能靠嵌套层次来写了,效果会差一点。如果不行的话,建议用正则表达式做辅助。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文