【问题标题】:Parsing comment levels from forum posts从论坛帖子中解析评论级别
【发布时间】:2016-05-25 17:08:52
【问题描述】:

是否可以像下面这样从这个网站找出评论级别? https://www.ozbargain.com.au/node/249439#comment-3719026

通过 jsoup,我能够解析 cmets、用户名等,但无法获得正确的评论级别。

查看该页面的来源,与正确的实时帖子不匹配,除非我读错了。

有没有办法解决这个问题?

我能够使用以下方法生成源评论级别:

        String url = "https://www.ozbargain.com.au/node/249439";
        Document doc = Jsoup.connect(url).get();
        Elements level = doc.select("ul.comment");


         for(Element column : e.select("ul")){
                //comment level
                System.out.println(column.attr("class"));
                levels.add(column.attr("class"));
            }

但它看起来不正确。仅显示 0 级评论中的 1 条等。

谢谢

【问题讨论】:

    标签: java android html jsoup


    【解决方案1】:
    for(Element column : e.select("ul")) {
        //comment level
        System.out.println(column.attr("class"));
        levels.add(column.attr("class"));
    }
    

    从上面的代码中,e 是从哪里来的?

    无论如何,你需要解析类属性值才能找到评论级别。

    这是一个工作示例代码:

    示例代码

    public static void main(String[] args) throws IOException {
        String url="https://www.ozbargain.com.au/node/249439#comment-3719026";
        Document doc = Jsoup.connect(url).get();
        Elements comments = doc.select("div.comment-wrap");
    
        Matcher levelMatcher = Pattern.compile("(?i)^(.*level)(\\d+)(.*)$").matcher("");
        List<String> levels = new ArrayList<>();
    
        System.out.println("Comments found: "+ comments.size());
    
        for (Element comment : comments) {            
            if (levelMatcher.reset(comment.parent().parent().className()).find()) {
                levels.add(levelMatcher.replaceAll("$2"));
            }
        }
    
        System.out.println(levels);
    }
    

    输出 [https://www.ozbargain.com.au/node/249439#comment-3719026] (可能会根据请求时间而变化)

    Comments found: 38
    [0, 1, 2, 3, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 2, 3, 3, 1, 2, 3, 3, 0, 1, 2, 3, 2, 3, 3, 2, 0, 0, 0, 1, 2, 3]
    

    输出 [https://www.ozbargain.com.au/node/249604] (可能会根据请求时间而变化)

    Comments found: 14
    [0, 1, 0, 1, 0, 1, 1, 2, 1, 0, 0, 1, 2, 0]
    

    【讨论】:

    • 哇,这是我第一次遇到 Matcher 类。这似乎是一种很好的方式来过滤掉我一直在结束的所有不必要的信息。谢谢,虽然看起来有点混乱,但我会尝试按照这个设计模式来解决下一个问题。
    • 刚刚又看了一遍,好像还有问题。在源代码中,在第一个评论(级别 0)之后,它不会显示任何进一步的级别 0(新的 cmets,而不是回复)。不知道我会怎么做,因为没有显示“类”,只有
  • @Petersicecream 只有一个level0。 ul.level0 保存所有 cmets 和对要约的回复。
  • 是的,它显示了第一个 level0,但由于某种原因,源停止显示未来的 level0,并且该部分为空白。比如link有8个cmets,假设有5个0级和3个1级。但是看看源,它的[0,1,1,1]。所以它缺少中间的0。解决方案假设为 [0,1,0,1,0,1,0,0]。谢谢,希望你能理解。
  • @Petersicecream 请查看我的更新。不要犹豫发布新的测试用例。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签