Java:Como faço para extrair o texto separado de aninhados <div> em HTML?
-
21-12-2019 - |
Pergunta
por Exemplo:
<div>
this is first
<div>
second
</div>
</div>
Eu estou trabalhando em Processamento de Linguagem Natural e eu tenho que traduzir um site(não usando o Google Translate) por que eu tenho que extrair ambas as frases "esta é a primeira" e "segunda" em separado, para que eu possa substituí-los com outro texto no idioma respectivo divs.Se eu extrair o texto para a primeira irá mostrar "esta é a primeira segunda" e se eu usar recursão para cavar mais fundo, é só extrair o "segundo"
Me ajudar por favor!
EDITAR
Usando ownText() método vai criar problema em o seguinte código 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>
Ele irá imprimir:
o que.
livre
enciclopédia
qualquer um pode editar a
Mas tem de ser:
o
que
.
enciclopédia
qualquer um pode editar a
Solução
Se eu extrair o texto para a primeira irá mostrar "esta é a primeira segunda"
Utilização ownText()
em vez de text()
e você vai ter apenas o elemento contém diretamente.
Aqui está um exemplo:
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);
Outras dicas
Você pode usar o analisador de XML em qualquer linguagem que você está usando.Aqui é para Java: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/
Parece que você está usando textContent na div para extrair o conteúdo, o que você irá obter o conteúdo desse elemento, e todos os descendentes de elementos.(Java:este seria o getTextContent do método de Elemento)
Em vez de examinar o childNodes (Java:getChildNodes do método de Elemento).Os nós têm uma propriedade "nodeType" (Java:getNodeType) que você pode olhar para descobrir se o nó é um Nó de Texto (Java:Nó.TEXT_NODE), ou um Elemento (Java:Nó.ELEMENT_NODE).Então, para tomar o exemplo que você tem uma árvore de Nós que se parecem com isso...
div (Element)
this is first (TextNode)
div (Element)
second (TextNode)
O exterior div diretamente contém apenas dois nós - a primeira parte do texto, e o centro da div.Interior div que contém o texto "segundo".
Para fazer um loop através de nós no exterior div, se o nó é um nó de texto, traduzir, caso contrário, recurse para o Elemento.Observe que existem outros tipos de nós, Comentários e afins, mas para os seus propósitos, você provavelmente pode ignorar aqueles.
Supondo que você esteja usando a API do DOM do w3c http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Node.html
Elements divs=doc.getElementsByTag("div");
for (Element element : divs) {
System.out.println(element.text());
}
Isso deve funcionar se você estiver usando o checkbox, radio buttons e analisador de HTML.