【问题标题】:Java: How do I extract separated text from nested <div> in HTML?Java:如何从 HTML 中的嵌套 <div> 中提取分隔文本?
【发布时间】:2014-06-03 07:03:18
【问题描述】:

例如:

<div>
    this is first
    <div>
        second
   </div>
</div>

我正在研究自然语言处理,我必须翻译一个网站(不是使用谷歌翻译),我必须分别提取“这是第一”和“第二”这两个句子,以便我可以用其他句子替换它们各个 div 中的语言文本。如果我首先提取文本,它会显示“这是第一秒”,如果我使用递归深入挖掘,它只会提取“秒”

请帮帮我!

编辑

使用 ownText() 方法会在以下 html 代码中产生问题:

<div style="top:+0.2em; font-size:95%;">
    the
    <a href="/wiki/Free_content" title="Free content">
        free
    </a>
    <a href="/wiki/Encyclopedia" title="Encyclopedia">
        encyclopedia
    </a>
    that
    <a href="/wiki/Wikipedia:Introduction" title="Wikipedia:Introduction">              
        anyone can edit
    </a>
    .
</div>

它将打印:

那个。

免费

百科全书

任何人都可以编辑

但必须是:

那个

.

百科全书

任何人都可以编辑

【问题讨论】:

标签: java html jsoup html-content-extraction


【解决方案1】:

如果我先提取文本,它将显示“这是第一秒”

使用ownText() 而不是text(),您将只获得直接包含的元素。

这是一个例子:

final String html = "<div>\n"
        + "    this is first\n"
        + "    <div>\n"
        + "        second\n"
        + "   </div>\n"
        + "</div>";

Document doc = Jsoup.parse(html); // Get your Document from somewhere


Element first = doc.select("div").first(); // Select 1st element - take the first found
String firstText = first.ownText(); // Get own text

Element second = doc.select("div > div").first(); // Same as above, but with 2nd div
String secondText = second.ownText();

System.out.println("1st: " + firstText);
System.out.println("2nd: " + secondText);

【讨论】:

    【解决方案2】:

    您可以使用任何语言的 XML 解析器。这是Java:http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/

    【讨论】:

      【解决方案3】:

      您似乎在 div 中使用 textContent 来提取内容,这将为您获取该元素的内容以及所有后代元素。 (Java:这将是 Element 上的 getTextContent 方法)

      改为检查 childNodes(Java:元素上的 getChildNodes 方法)。节点具有属性“nodeType”(Java:getNodeType),您可以查看该属性以确定节点是文本节点(Java:Node.TEXT_NODE)还是元素(Java:Node.ELEMENT_NODE)。所以举个例子,你有一棵看起来像这样的节点树......

      div (Element)
          this is first (TextNode)
          div (Element)
              second (TextNode)
      

      外层 div 直接只包含两个节点——第一段文本,和内层 div。然后,该内部 div 包含文本“second”。

      所以循环遍历外部div中的节点,如果节点是文本节点,则翻译,否则递归到元素中。请注意,还有其他类型的节点、评论等,但出于您的目的,您可以忽略这些。

      假设您使用的是 w3c DOM API http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html

      【讨论】:

        【解决方案4】:
         Elements divs=doc.getElementsByTag("div");
        
             for (Element element : divs) {
                    System.out.println(element.text());
        
                }
        

        如果您使用的是 jsoup HTML 解析器,这应该可以工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-19
          • 1970-01-01
          • 1970-01-01
          • 2010-10-30
          • 2014-05-03
          • 1970-01-01
          • 2015-10-11
          相关资源
          最近更新 更多