【问题标题】:jSoup to get text from <span> classjSoup 从 <span> 类中获取文本
【发布时间】:2013-08-14 09:15:09
【问题描述】:

我有一部分 HTML 文件,格式如下:

<h6 class="uiStreamMessage" data-ft="_____"> 
   <span class="messageBody" data-ft="____"> Welcome
   </span>
</h6>

在文件中,还有其他 span 类。但我只想获取所有“messageBody”跨度的文本,它将被插入到数据库中。

我试过了:

Elements links = doc.select("span.messageBody");
for (Element link : links) {
     message = link.text();
     // codes to insert into DB
}

甚至

Elements links = doc.select("h6.uiStreamMessage span.messageBody");

两者都不起作用。我无法从其他地方找到任何解决方案。 请帮忙。

**编辑

我已经意识到它是 html 文件中的一个嵌套跨度:

<h6 class="uiStreamMessage" data-ft=""> 
   <span class="messageBody" data-ft="">Twisted<a href="http://"><span>http://</span>
   <span class="word_break"></span>www.tb.net/</a> Balloons
   </span>
</h6>

而且只是有时在“messageBody”范围内还有另一个范围。如何获取“messageBody”范围内的所有文本?

【问题讨论】:

  • 我问你一个问题,'message'的内容是什么?您是否尝试过每次都记录它?
  • “消息”为空。我有一些'println()',只要在那个'for'循环之后,它们就不会打印任何东西。
  • 好吧,在循环后'message'应该只有最后一个span.messageBody的文本。在循环之后使用“消息”是个坏主意。如果您需要这种方式,也许您应该将消息存储在 List
  • 谢谢,我会记住的。不过,我已经意识到哪里出了问题。我已经编辑了问题,请看一下。
  • 使用您发布的最新 html,您要检索的确切文本是什么?那个html是一团糟..

标签: java parsing jsoup


【解决方案1】:
 String html = "<h6 class='uiStreamMessage' data-ft=''><span class='messageBody' data-ft=''>Twisted<a href='http://'><span>http://</span><span class='word_break'></span>www.tb.net/</a> Balloons</span></h6>";
 Document doc = Jsoup.parse(html);
 Elements elements = doc.select("h6.uiStreamMessage > span.messageBody");
 for (Element e : elements) {
      System.out.println("All text:" + e.text());
      System.out.println("Only messageBody text:" + e.ownText());
}

脸书专页https://www.facebook.com/pages/The-Nanyang-Chronicle/141387533074

try {
        Document doc = Jsoup.connect("https://www.facebook.com/pages/The-Nanyang-Chronicle/141387533074").timeout(0).get();

        Elements elements = doc.select("code.hidden_elem");
        for (Element e : elements) {
            String eHtml = e.html().replace("<!--", "").replace("-->", "");
            Document eWIthoutComment = Jsoup.parse(eHtml);
            Elements elem = eWIthoutComment.select("h6.uiStreamMessage >span.messageBody");
            for (Element eb : elem) {
                System.out.println(eb.text());                   
            }
        }
    } catch (IOException ex) {
        System.err.println("Error:" + ex.getMessage());
    }

【讨论】:

  • 我已经尝试了上述方法,它可以工作。但是当我尝试输入 html 文件并从中提取数据时,它不起作用。如果我有多个
    怎么办?
  • 在答案中您可以看到 first() 方法。这得到了
    的第一次出现。取而代之的是,不要使用 first(),而是迭代元素。检查编辑答案。
  • 非常感谢。我知道它应该可以工作,但我认为fb页面中的html标签太复杂了,这就是为什么我输入html时它不起作用的原因。有什么办法可以帮助我吗?
  • 有什么可以帮助您的吗?新问题是什么?
  • 问题是源码在html注释之间:,选择器不起作用。
【解决方案2】:

不知道为什么它不适合你。这是我的代码。它将Welcome 打印到控制台。

String html = "<h6 class=\"uiStreamMessage\" data-ft=\"_____\">" + 
    "<span class=\"messageBody\" data-ft=\"____\"> Welcome</span>" +
    "</h6>";

Document doc = Jsoup.parse(html);
for (Element e : doc.select("span.messageBody")) {
    System.out.println(e.text());
}

这基本上与您的代码相同,所以这里肯定有其他东西在起作用。

【讨论】:

  • 我已经尝试了上面的代码,它也在我这边工作。我实际上是在传递一个我从互联网上“复制”的 html 文件。它不起作用,但它适用于另一个 html 文件。我已经编辑了这个问题,请看一下,看看你是否可以帮助我。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多