【问题标题】:Parse HTMl using JSOUP - Need specific pattern使用 JSOUP 解析 HTMl - 需要特定模式
【发布时间】:2020-04-10 02:15:09
【问题描述】:

我正在尝试获取标签之间的文本并保存到某个变量中,例如: 在这里,我想保存 return 之间的值 em 标签。我还需要p标签中的其余文本, em 标记值分配有 returnp 标签值应该只返回 --> an item, cancel an order, print a receipt, track your purchases or reorder items. 如果某个值在em 标签之前,即使该值也应该在不同的变量中,基本上是一个p 如果它有多个标签,那么它应该被拆分并保存到不同的变量中。如果我知道如何获取不在内部标签中的其余文本,我可以检索其余部分。

我在下面写了:下面只返回“em”标签中的“return”。 这里ep 基本上是doc.select(p),选择p 标签然后迭代,不确定我的方法是否正确,任何其他方法都非常感谢。

String text ="\<p><em>return </em>an item, cancel an order, print a receipt, track your purchases or reorder items.</p>"

Elements italic_tags = ep.select("em");
for(Element em:italic_tags) { 
 if(em.tagName().equals("em")) {
    System.out.println( em.select("em").text());
   }
}

【问题讨论】:

    标签: java html parsing jsoup html-parsing


    【解决方案1】:

    如果您需要选择每个子文本和被不同标签包围的文本,您需要尝试选择Node 而不是Element。我修改了您的 HTML 以包含更多标签,因此示例更完整:

            String text = "<p><em>return </em>an item, <em>cancel</em> an order, <em>print</em> a receipt, <em>track</em> your purchases or reorder items.</p>";
            Document doc = Jsoup.parse(text);
    
            Element ep = doc.selectFirst("p");
            List<Node> childNodes = ep.childNodes();
            for (Node node : childNodes) {
                if (node instanceof TextNode) {
                    // if it's a text, just display it
                    System.out.println(node);
                } else {
                    // if it's another element, then display its first
                    // child which in this case is a text
                    System.out.println(node.childNode(0));
                }
            }
    

    输出:

    return 
    an item, 
    cancel
     an order, 
    print
     a receipt, 
    track
     your purchases or reorder items.
    

    【讨论】:

    • 非常感谢,这给了我一些想法,但我的用例是同一文本会有多个标签,比如说,

      return 一个项目 cancel

      类似这样,代码只适用于子节点,如果我有多个子节点怎么办一个子节点
    • 您可以遍历.childNodes() 的每个孩子,然后为每个孩子搜索所有.childNodes()。创建递归函数来执行此操作,直到没有更多子节点或找到`instanceof TextNode`为止。
    • 非常感谢您的回复!
    • 嗨,还有一个问题,这是换行元素,如果我正在阅读此节点“
      测试换行符”,我需要得到“测试换行符”的响应。如何得到这个?我在下面尝试过,但它拆分为文本并将两者作为不同的值返回 String line_break ="


      test line break.

      ";文档 doc = Jsoup.parse(line_break);元素 para_tags = doc.select("p"); for (元素 e : para_tags) { System.out.println(para_tags); List childNodes = e.childNodes(); for (Node node : childNodes) { System.out.println(node); } }
    • 尝试使用doc.select("br").remove();选择和删除每个&lt;br&gt;
    猜你喜欢
    • 2012-05-27
    • 2012-11-06
    • 1970-01-01
    • 2020-06-01
    • 2012-12-27
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多