使用Xpath提取网页元素

fairyks 发布于 2013/11/29 15:57
阅读 8K+
收藏 2

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

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

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


加载中
0
黄亿华
黄亿华
表格布局的话,xpath只能靠嵌套层次来写了,效果会差一点。如果不行的话,建议用正则表达式做辅助。
0
fairyks
fairyks
@黄亿华 ,谢谢您的回答。
0
Timco
Timco
没问题的呀-.-肯定是你输入的表达式不对
0
Timco
Timco

引用来自“fairyks”的答案

感觉不用试了,这个一排tr标签,用css选择器明显方便好多啊。然后遍历elements就好了。用xpath的话,得到的内容都连在一起了。
0
fairyks
fairyks
@Timco ,对此站,无语。
0
chaifuzhi1025
chaifuzhi1025
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]”这种方式处理了,怎么不可以用?
0
chaifuzhi1025
chaifuzhi1025
@黄亿华
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]”这种方式处理了,怎么不可以用?
0
chaifuzhi1025
chaifuzhi1025
@黄亿华
我 读过你的代码,包括你学习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();”这种方式获取数据?
0
黄亿华
黄亿华
你可以用HtmlCleaner来试下是否支持 siblingsindex。Spider.xsoupOff()
返回顶部
顶部