【问题标题】:Jsoup - Extract from html string with the same span class nameJsoup - 从具有相同跨度类名称的 html 字符串中提取
【发布时间】:2015-06-19 12:47:19
【问题描述】:

我还是 html 的新手。对于 Android 项目,我需要使用 jsoup 从 html 字符串中提取一些数据。结构是这样的。所有跨度标签具有相同的类名。而我需要的数据介于两者之间。

<span class="head">a</span>
xxxx data xxxx
<span class="head">b</span>
xxxx data xxxx
<span class="head">c</span>
xxxx data xxxx

有什么办法可以提取出来吗?

【问题讨论】:

  • 告诉我你到目前为止做了什么。我们将从那里开始。

标签: html jsoup


【解决方案1】:

你必须做两件事:

  • 选择您感兴趣的文本节点之前的所有元素,
  • 使用nextSibling方法获取文本节点。

看看这个示例代码: 导入 org.jsoup.Jsoup; 导入 org.jsoup.nodes.Document; 导入 org.jsoup.nodes.Element; 导入 org.jsoup.nodes.TextNode;

public class JsoupExample {

    public static void main(String[] args) {
        String html = "<span class=\"head\">a</span>\n" +
                "xxxx data xxxx\n" +
                "<span class=\"head\">b</span>\n" +
                "xxxx data xxxx\n" +
                "<span class=\"head\">c</span>\n" +
                "xxxx data xxxx";

        Document document = Jsoup.parse(html);

        for (Element span : document.select("span.head")) {
            TextNode node = (TextNode) span.nextSibling();

            assert "xxxx data xxxx".equals(node.text());

            System.out.println(node.text());
        }
    }
}

它使用您的输入并显示两个步骤。

在这里document.select("span.head"),我们选择类head 的所有元素,然后我们使用forEach(span -&gt; {}) 函数和lambda 表达式遍历这些元素(这是Java 8 示例)。然后我们得到有趣的文本节点:TextNode node = (TextNode) span.nextSibling(); 这里我们只是通过断言检查文本节点是否等于我们期望的值,我们只是将它显示到标准输出。

根据您的需要修改此代码示例。希望对你有帮助。

【讨论】:

  • 谢谢你解释得这么好。但不幸的是,目前对 Android 的 lambda 支持似乎相当老套。
  • 嘿@arjerine,Java 8 不是问题,因为它仅用于迭代和打印节点文本。我将示例更改为与 Java 6/7 兼容。您正在寻找的解决方案是正确使用 nextSibling 方法,我希望它显示在示例代码示例中。
  • nextSibling() to TextNode 出于某种奇怪的原因抛出 ClassCastException。但无论如何,我设法通过稍微调整代码来获取数据。再次感谢@SzymonStepniak
  • 您可能导入了错误的TextNode 类。检查导入的TextNode 是否等于org.jsoup.nodes.TextNode。我可以想象在 Android 平台中可能还有另一个 TextNode 类,它位于完全不同的包中。干杯!
  • 即使 Element 和 TextNode 来自 org.jsoup.nodes,我也会收到 ClassCastException。 @goat 你能分享一下你做了什么来调整这个吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-18
  • 2015-05-12
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
相关资源
最近更新 更多