# Java HTML Parser - suchen und ersetzen



## -AbeAdapti- (12. Januar 2011)

Hi,
brauche eigentlich etwas ganz banales. Muss in einem HTML nach einem bestimmten Tag suchen und dahinter einen wert einfügen. 

zb.
	
	
	



```
<html>...<searchedTag> <insert here> ....</hmtl>
```

man könnte das ganze mit Regular expressions lösen, aber ich wollte einen HTML Parser zwecks flexibilität nutzen. Vielleicht hatte jemand etwas im Einsatz (google wurde shcon intensiv genutzt, aber es gibt nur wenig gute doku)


----------



## benjamin10 (12. Januar 2011)

Hallo,

ich hab dir mal ein kleines Beispiel gemacht:


```
package de.tutorials;

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
import org.xml.sax.InputSource;

public class HTMLModify {

	public static Document stringToDocument(String htmlString) throws Exception {
		DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		return builder.parse(new InputSource(new StringReader(htmlString)));
	}

	public static String documentToString(Document document) throws Exception {
		StringWriter writer = new StringWriter();
		TransformerFactory factory = TransformerFactory.newInstance();
		Transformer transformer = factory.newTransformer();
		transformer.transform(new DOMSource(document), new StreamResult(writer));
		return writer.getBuffer().toString();
	}

	public static void main(String[] args) throws Exception {
		String source = 
			"<html>" +
				"<head>" +
					"<title>Tutorials.de</title>" +
				"</head>" +
				"<body>" + 
					"<searchedTag></searchedTag>" +
					"<searchedTag></searchedTag>" +
				"</body>" +
			"</html>";
		Document sourceDoc = stringToDocument(source);
		NodeList searchedTags = sourceDoc.getElementsByTagName("searchedTag");
		for (int i=0; i<searchedTags.getLength(); i++) {
			Node node = sourceDoc.createElement("insertedTag");
			Node searchedTag = searchedTags.item(i);
			searchedTag.appendChild(node);
		}
		System.out.println(documentToString(sourceDoc));
	}
}
```

Ausgabe:


```
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Tutorials.de</title>
</head>
<body>
<searchedTag>
<insertedTag></insertedTag>
</searchedTag>
<searchedTag>
<insertedTag></insertedTag>
</searchedTag>
</body>
</html>
```

Gruß
Ben


----------



## Thomas Darimont (12. Januar 2011)

Hallo,

ich würde das einfach mit jsoup (http://jsoup.org/) machen. Da ist viel einfacher als mit dem Transformer zu arbeiten... vor allem tolleranter gegen "real-world-html"  ;-) Außerdem erlaubt JSoup ähnlich mächtige CSS Selector Abfragen wie die Java Script Bibliothek JQuery 

```
package de.tutorials;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

public class AddElementToHtmlExample {
	public static void main(String[] args) {
		String html = "<html><head><title>test</title></head><body><a id='xxx' href='foo'>A</a></body></html>";
		Document doc = Jsoup.parse(html, "");
		System.out.println(doc);
		System.out.println("####");
		doc.getElementById("xxx").after("<a id='yyy' href='bar'>B</a>");
		System.out.println(doc);
	}
}
```

Ausgabe:

```
<html>
 <head>
  <title>test</title>
 </head>
 <body>
  <a id="xxx" href="foo">A</a>
 </body>
</html>
####
<html>
 <head>
  <title>test</title>
 </head>
 <body>
  <a id="xxx" href="foo">A</a>
  <a id="yyy" href="bar">B</a>
 </body>
</html>
```

Gruß Tom


----------



## benjamin10 (12. Januar 2011)

Hallo,

oh, so einfach geht das? Vielen Dank! Das kommt direkt in meine Lesezeichen!

Gruß Ben


----------



## -AbeAdapti- (13. Januar 2011)

Perfekt! Bin schon auf den ersten Blick darauf ein Fan.


----------



## gr170 (25. April 2014)

ich könnte in dieser Sache auch ein wenig unterstütztung gebrauchen. Ich bekomme es nicht hin den korrekten sektor für die Abfrage zu beschreiben. Thomas kannst du mir dabei ev. von einer speziellen Seite helfen ?


----------



## Thomas Darimont (25. April 2014)

Hallo,

was willst du denn machen?

Gruß Tom


----------



## gr170 (25. April 2014)

Ich habe soeben ein neues Thema eröffnet. Ich brauch daten von einem Börsenkursverlauf für statistischen Auswertungen. Leider hat der Anbieter keine Benutzerschnittstellen und auch das auslesen über Bilddatei und OCR ist gescheitert da die Daten zu klein sind. Ich brauch also echt  bischen mehr als einen Schupser lach. ZUmal ich irgendwie entnerft und festgefahren bin. Dazu kommt das ich leider sehr schlecht Englisch kann ( zu damaligen Zeiten bei uns war es nicht möglich dies zu lernen) und auch noch anfänger in Java bin. Allerdings hab ich bereits mit acces Datenbanken MSQL und php einiges gemacht und in grauer Vorzeit auch unter Pascale programiert.


----------

