Java:如何从HTML中的嵌套<div>中提取分离的文本?</div>

时间:2014-06-03 07:03:18

标签: java html jsoup html-content-extraction

例如:

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

我正在从事自然语言处理,我必须翻译一个网站(不是使用谷歌翻译),我必须提取两个句子&#34;这是第一个&#34;和&#34;第二&#34;单独使我可以用相应的div中的其他语言文本替换它们。如果我首先提取文本它将显示&#34;这是第一秒&#34;如果我使用递归深入挖掘,它只会提取&#34;第二个&#34;

请帮帮我!

修改

使用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>

会打印:

那个。

自由

百科全书

任何人都可以编辑

但必须是:

百科全书

任何人都可以编辑

4 个答案:

答案 0 :(得分:2)

  

如果我首先提取文本,它将显示&#34;这是第一秒&#34;

使用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);

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

而是检查childNodes(元素上的Java:getChildNodes方法)。节点具有属性&#34; nodeType&#34; (Java:getNodeType),您可以查看该节点是文本节点(Java:Node.TEXT_NODE)还是元素(Java:Node.ELEMENT_NODE)。所以以你为例,你有一个看起来像这样的节点树......

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

外部div直接只包含两个节点 - 第一段文本和内部div。那个内部div然后包含文本&#34; second&#34;。

因此循环遍历外部div中的节点,如果节点是文本节点,则转换,否则递归到Element中。请注意,还有其他类型的节点,评论等,但出于您的目的,您可能会忽略这些节点。

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

答案 3 :(得分:0)

 Elements divs=doc.getElementsByTag("div");

     for (Element element : divs) {
            System.out.println(element.text());

        }

如果您正在使用jsoup HTML解析器,这应该可以使用。