繁体   English   中英

使用 Jsoup 获取数据

[英]Getting data in order with Jsoup

我正在尝试从网络中按顺序从 html 获取数据。 Html 代码如下所示:

 <div class="text"> First Text <br> <br> <div style="margin:20px; margin-top:5px; "> <table cellpadding="5"> <tbody><tr> <td class="alt2"> <div> Written by <b>excedent</b> </div> <div style="font-style:italic">quote message</div> </td> </tr> </tbody></table> </div>Second Text<br> <br> <img class="img" src="https://developer.android.com/_static/images/android/touchicon-180.png"><br> <br> Third Text </div>

我想做的是创建一个抓取 html 的 Android 布局,但我需要保留元素的顺序。 在这种情况下:

  1. TextView => 第一个文本
  2. TextView => 报价信息
  3. TextView => 第二个文本
  4. 图像视图 => img
  5. TextView => 第三个文本

当我尝试按顺序获取 html 值时,问题就出现了,使用 JSoup 我得到一个带有“第一个文本第二个文本第三个文本”的字符串和 Element.ownText,然后是 img 最后,结果:

  1. TextView => 第一个文本 第二个文本 第三个文本
  2. TextView => 报价信息
  3. 图像视图 => img

我该怎么做才能按顺序获取这些数据?

提前致谢

您可以将 html 解析为 html 节点列表。 节点列表将保留 DOM 顺序并提供您想要的。

检查parseFragment方法:

此方法将为您提供节点列表。

试试这个。

    String html = ""
        + "<div class=\"text\">"
        + "    First Text"
        + "    <br>"
        + "    <br>"
        + "    <div style=\"margin:20px; margin-top:5px; \">"
        + "    <table cellpadding=\"5\">"
        + "        <tbody><tr>"
        + "            <td class=\"alt2\">"
        + "                <div>"
        + "                    Written by <b>excedent</b>"
        + "                </div>"
        + "                <div style=\"font-style:italic\">quote message</div>"
        + "            </td>"
        + "            </tr></tbody>"
        + "    </table>"
        + "    </div>Second Text<br>"
        + "        <br>"
        + "        <img class=\"img\" src=\"https://developer.android.com/_static/images/android/touchicon-180.png\"><br>"
        + "        <br>"
        + "        Third Text"
        + "    </div>";
    Document doc = Jsoup.parse(html);
    List<String> rootTexts = doc.select("div.text").first().textNodes().stream()
        .map(node -> node.text().trim())
        .filter(s -> !s.isEmpty())
        .collect(Collectors.toList());
    System.out.println(rootTexts);

输出:

[First Text, Second Text, Third Text]

这个答案有点晚了,但是做你想做的事情的正确方法是这样的。 对于最外面的<div> ,不是使用Element.children()获取子元素,而是要使用Element.childNodes()

Element.children()只返回子Elements ,其中不包含文本。

Element.childNodes()返回所有子节点,包括TextNodesElements

这个解决方案对我有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM