Java: Come estrai il testo separato da NESTED in HTML?
-
21-12-2019 - |
Domanda
Ad esempio:
<div>
this is first
<div>
second
</div>
</div>
.
Sto lavorando all'elaborazione del linguaggio naturale e devo tradurre un sito Web (non utilizzando Google Translate) per il quale devo estrarre entrambe le frasi "questo è il primo" e "secondo" separatamente in modo che io possa sostituirli con altriTesto della lingua nei rispettivi div.Se estrai il testo per il primo, mostrerà "questo è il primo secondo" e se utilizzo la ricorsione per scavare più a fondo, estrarrà solo "secondo"
Aiutami fuori per favore!
Modifica
Utilizzo del metodo OwnText () creerà il problema nel seguente codice 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>
.
Stamperà:
Il quello.
libero
Encyclopedia
Chiunque può modificare
Ma deve essere:
.
Encyclopedia
Chiunque può modificare
Soluzione
.Se estrai il testo per il primo, mostrerà "questo è il primo secondo"
Utilizzare ownText()
anziché text()
e riceverai solo l'elemento contiene direttamente.
Ecco un esempio:
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);
. Altri suggerimenti
È possibile utilizzare XML Parser, in qualsiasi lingua che stai utilizzando.Qui è per Java: http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-Parser/
Sembra che tu stia usando TextContent nei div per estrarre il contenuto, che ti porterà il contenuto di quell'elemento e tutti gli elementi discendenti. (Java: questo sarebbe il metodo GetTextContent sull'elemento)
Invece esaminare i bambini (Java: Metodo GetChildNodes sull'elemento). I nodi hanno una proprietà "NodeType" (Java: getnodetype) che è possibile guardare per elaborare se il nodo è un nodo di testo (Java: node.text_node) o un elemento (Java: node.element_node). Quindi per portarti ad esempio hai un albero di nodi che assomigliano a questo ...
div (Element)
this is first (TextNode)
div (Element)
second (TextNode)
.
Il div esterno contiene direttamente solo due nodi - il primo pezzo di testo e il div interno. Quel div interno contiene quindi il testo "secondo".
Così loop sopra i nodi nel div esterno, se il nodo è un nodo di testo, traduci, altrimenti ricurse nell'elemento. Si noti che ci sono altri tipi di nodi, commenti e simili, ma per i tuoi scopi puoi probabilmente ignorare quelli.
Supponendo che tu stia usando l'API del W3C DOM 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());
}
.
Questo dovrebbe funzionare se si utilizza Jsoup HTML Parser.