【问题标题】:Java Jsoup : Extract all the textJava Jsoup:提取所有文本
【发布时间】:2018-06-09 15:16:06
【问题描述】:

我有以下代码。 doc.body.text() 语句不输出样式和脚本标签中的文本。我阅读了 .text() 函数代码,它查找 TextNode 的所有实例。 Jsoup 中的 TextNode 是什么。

为什么.text() 输出中不包含脚本文本。

String contex = "<html><body><style>style</style><div>div</div><script>script</script><p>paragraph</p>body</body></html>";
    Document doc = Jsoup.parse(contex, "UTF-8");
    String text = doc.body().text();
    System.out.println("Test text : " + text);

输出:段落正文

【问题讨论】:

    标签: javascript java html parsing jsoup


    【解决方案1】:

    为此,您需要使用org.jsoup.select.Elements 来解析&lt;script&gt; 等标签。

    String contex = "<html><body><style>style</style><div>div</div><script>scripts</script><p>paragraph</p><p>body</p><script>787878</script></body></html>";
            Document doc =Jsoup.parse(contex, "UTF-8");
             Elements scriptElements = doc.getElementsByTag("script");
    
             for (Element el :scriptElements ){                
                    for (DataNode dn : el.dataNodes()) {
                        System.out.println(dn.getWholeData());
                    }
              }
    

    操作:

    scripts
    787878
    

    【讨论】:

    • .text() 函数涵盖的所有元素是什么?元素,我的意思是 div、p、h 等 ..
    • @user8788828 除了stylescriptCData 之外的所有内容。
    【解决方案2】:

    为什么.text() 输出中不包含脚本文本。

    因为scriptstyle数据,而不是文本

    要从script的数据中获取数据,请使用getElementsByTag

    Elements scriptElements = doc.getElementsByTag("script");
    

    通过getWholeData访问

    for (Element element :scriptElements ){                
        for (DataNode node : element.dataNodes()) {
            System.out.println(node.getWholeData());
        }
        System.out.println("-------------------");            
    }
    

    根据source code,对于stylescript 标签被视为dataNode 而不是textNode

    void insert(Token.Character characterToken) {
            Node node;
            // characters in script and style go in as datanodes, not text nodes
            final String tagName = currentElement().tagName();
            final String data = characterToken.getData();
    
            if (characterToken.isCData())
                node = new CDataNode(data);
            else if (tagName.equals("script") || tagName.equals("style"))
                node = new DataNode(data);
            else
                node = new TextNode(data);
            currentElement().appendChild(node); // doesn't use insertNode, because we don't foster these; and will always have a
       stack.
        }
    

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 1970-01-01
      • 2019-07-26
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      相关资源
      最近更新 更多