当前位置: 首页 > 知识库问答 >
问题:

如何使用JSoup以正确的顺序遍历文本和属性的html

方德宇
2023-03-14

如何使用 JSoup 以正确的顺序循环访问文本和属性的 html。

<a href="link1"> text child 1</a>
own text 1
<b> text child 2</b>
own text 2

我想对每个属性/文本进行一些处理。例如,最终输出可能如下所示: -

1) text child 1 (is a link)
2) own text 1 
3) text child 2 (is bold)
4) own text 2

目前,我可以迭代子元素

Elements elements = element.children(); //gives my child 1 and 2;
for(element e: elements){ 
    //... do processing plus extract childText... 
}

或者有自己的短信,但我不知道如何两者兼顾。

String text = element.ownText(); // gives me own text 1 and 2;

另外,我不想使用(因为行信息丢失了)

String text =element.Text(); 

如何迭代元素,以便获得

child 1 -> text 1 -> child 2 -> text 2 (where text 1 and 2 are separated)

共有1个答案

张承颜
2023-03-14

如果你的HTML不是很复杂,你可以使用:

for (Node node : document.body().childNodes()) {
    if (node instanceof TextNode) {
        System.out.println(((TextNode) node).text());
    } else if (node instanceof Element) {
        System.out.println(((Element) node).ownText());
    }
}

如果它更复杂,您可以递归地遍历元素树:

public static void main(String[] args) {
    try {
        Document document = Jsoup
                .parse("<a href=\"link1\"> text child 1</a>\r\n" + "own text 1\r\n" + "<b> text child 2</b>\r\n" + "own text 2");

        handleElement(document.body());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void handleElement(Node parent) {
    if (parent instanceof TextNode) {
        System.out.println(((TextNode) parent).text());
    }
    for (Node node : parent.childNodes()) {
        handleElement(node);
    }
}

这段代码打印出您所描述的内容:

int counter = 1;
for (Node node : document.body().childNodes()) {
    if (node instanceof TextNode) {
        System.out.println(counter++ + ") " + ((TextNode) node).text().trim());
    } else if (node instanceof Element) {
        Element element = (Element) node;
        String suffix = "";
        if ("a".equals(element.tagName())) {
            suffix = " (is a link)";
        } else if ("b".equals(element.tagName())) {
            suffix = " (is bold)";
        }
        System.out.println(counter++ + ") " + element.ownText() + suffix);
    }
}

1)子文本1(是一个链接)< br> 2)自己的文本1
3)子文本2(粗体)< br> 4)自己的文本2

 类似资料:
  • 问题内容: 我正在尝试使用Powershell访问JSON对象的特定属性值。不幸的是,我不知道结构中某些父级属性的键,因此我无法直接做到这一点。另外,由于JSON不是数组,因此无法通过索引位置访问。 上下文是我正在从elasticsearch查询正在运行的任务列表,并且需要获取任务的ID(我知道只有一个),因此我可以进行后续调用以发现其完成状态。 我已经研究了一些查询方法,但是不确定如何应用它们(

  • 问题内容: 我有一个LinkedHashMap: 我需要从给定键的位置向后迭代。因此,如果为我提供了第十个项目的密钥,则需要向后迭代哈希表9、8、7等。 问题答案: 您不必遍历它。但是拔下钥匙并将其存储在列表中会很方便。这就是执行indexOf()类型操作的唯一方法。

  • 问题内容: 我有这样的html结构。我想获取没有类或ID的第二张表。我如何从中获得第二张桌子? 我正在尝试这样 谁能帮我? 问题答案: 您想遍历元素吗?最好从像 您只能这样做。

  • 我面临下一个问题。我有一个.txt文件,它包含的数据格式如下: “name”=“value” 并以这段代码为例,尝试用JSR223采样器或Beanshell采样器将其转换为hashmap。然后,我想将一些值从映射到属性,以便在下一个带有请求的线程中使用: 但不管用。当我想看看道具包含什么的时候--实际结果是这样的: 预期结果应为: 所以我没有任何名为${schStart}的变量,不明白JMeter

  • 本文向大家介绍vue使用v-for遍历对象时,是按什么顺序遍历的?如何保证顺序?相关面试题,主要包含被问及vue使用v-for遍历对象时,是按什么顺序遍历的?如何保证顺序?时的应答技巧和注意事项,需要的朋友参考一下 1、会先判断是否有iterator接口,如果有循环执行next()方法 2、没有iterator的情况下,会调用Object.keys()方法,在不同浏览器中,JS引擎不能保证输出顺序

  • 二叉树的预序遍历是{8,5,9,7,1,12,4,11,3},其顺序是{9,5,1,7,12,8,4,3,11}。用它构造二叉树并执行级别顺序遍历。最后构造一个二叉搜索树(BST),从左到右依次获取在上述级别顺序遍历中出现的键值。这个BST的级别顺序遍历是什么?