3. Element mit regulären Ausdruck suchen

3ul3

Mitglied
Hallo,
habe ein Problem. Ich würde gerne mit Hilfe von regulären Ausdrücken aus einem Text das 3. <li> Element rausholen.
Ist so etwas möglich, wenn ja wäre ich dak bar für schnelle Hilfe.

P.S. Habe leider nur kurz geschaut ob es so ein Thema schon gibt (falls ja sry für doppel post) habe aber nix gefunden.
 
hab halt eine liste von <li> und brauch nur die ersten 3 von 10, wie würde deine lösung aussehen wenn ich die verankern müsste?

Danke schonmal für deine Hilfe
 
Ungetestet :

.*<li>.*<li>.*?(<li>)


Mittels Index kann dann ab dem 3. weiter gesucht werden.

edit: Was willst du genau?

Jedes 3. != die ersten 3 von 10
 
ansich würde das gehen, nur leider ist das eine externe Seite, wo sich die id immer ändern und halt immer die ersten 3 angezeigt werden sollen

Edit:
Also sind News auf externen Seite und will immer die ersten 3. News also müsste ich das mit zählen machen. aber mit {3} würd es sicher auch nicht gehen
 
sry wenn ich dich etwas verwirre.

Also die News welche immer ein <li> objetzt sind haben ids z.b id="artikel-23", wenn eine neue News kommt rutsch das runter und oben steht das neue <li> Objekt mit z.b id="artikel-54". und immer die ersten 3 soll es anzeigen.
 
weil da vermutlich noch Parameter im <li> stecken. An deiner Stelle würde ich immer den 1. li-tag rausfinden und das bereits untersuchte löschen oder die startposition für die Untersuchung verschieben. So bist du etwas flexibler.
 
Ein Blick in die API bei Matcher verrät:
public boolean find(int start)
Resets this matcher and then attempts to find the next subsequence of the input sequence that matches the pattern, starting at the specified index.
Das hat aber mit reguläden Ausdrücken nichts zu tun.
 
Du kannst die Gruppen speichern.

<li> text1
<li> text2
<li> text3
<li> text4
<li> text5
<li> text6

z.B. : (<li> \p{L}*\d*)

und mittels matcher.group(index) nur die Gruppen 1,2 & 3 speichern.
 
Ich verstehe nicht so recht, wieso man das ganze nicht mit einem allgemeinen regulären Ausdruck für Listenobjekte macht und dann einfach mitzählt. So zum Beispiel:
Java:
public static void main(String[] args)
{
	String data = "";
	try {
		Scanner scanner = new Scanner(new File("test.html"));
		data = scanner.useDelimiter("\\Z").next();
		scanner.close();
	} catch(FileNotFoundException e) {
		e.printStackTrace();
	}
	Pattern pattern = Pattern.compile("(?s)<li(?:(?:\"[^\"]*\"|\'[^\']*\'|[^\"\'>]*)*)>(.*?)</li>");
	Matcher matcher = pattern.matcher(data);
	for(int i = 0; i < 3 && matcher.find(); ++i) {
		System.out.printf("%d. Listenobjekt: %s%n", i + 1, matcher.group());
	}
}
Inhalt der test.html
HTML:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
	<title>Testseite</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
	<p>
		Test blah blah Test
	</p>
	<ul>
		<li id="artikel-54">
			<h3>Listenobjekt 1</h3>
			<p>Blah blah Blah</p>
		</li>
		<li id="artikel-42">
			<h3>Listenobjekt 2</h3>
			<p>Blah blah Blah</p>
		</li>
		<li id="artikel-23">
			<h3>Listenobjekt 3</h3>
			<p>Blah blah Blah</p>
		</li>
		<li id="artikel-16">
			<h3>Listenobjekt 4</h3>
			<p>Blah blah Blah</p>
		</li>
		<li id="artikel-15">
			<h3>Listenobjekt 5</h3>
			<p>Blah blah Blah</p>
		</li>
		<li id="artikel-8">
			<h3>Listenobjekt 6</h3>
			<p>Blah blah Blah</p>
		</li>
		<li id="artikel-4">
			<h3>Listenobjekt 7</h3>
			<p>Blah blah Blah</p>
		</li>
	</ul>
</body>
</html>
Ausgabe:
Code:
1. Listenobjekt: <li id="artikel-54">
			<h3>Listenobjekt 1</h3>
			<p>Blah blah Blah</p>
		</li>
2. Listenobjekt: <li id="artikel-42">
			<h3>Listenobjekt 2</h3>
			<p>Blah blah Blah</p>
		</li>
3. Listenobjekt: <li id="artikel-23">
			<h3>Listenobjekt 3</h3>
			<p>Blah blah Blah</p>
		</li>
 
Ganz allgemein: Informationen aus Htmlseiten zu extrahieren macht mit XPath mehr Spaß als mit regulären Ausdrücken. Wenn du ein Toolkit wie HtmlCleaner verwendest kannst du die gesuchten li-Tags mit einem einfachen XPath-Ausdruck spezifizieren. Um z.B. ein einem Html Dokument nach der ersten nicht nummerierten Liste, die li-Tags mit dem Attribute ID enthält, zu suchen, und davon die ersten drei Einträge zu bekommen, kann man schreiben:
Java:
myHtml.evaluateXPath("//ul/li[@id][position() <= 3]")
(oder so ähnlich, genau habe ich das auch nicht mehr im Kopf)
 

Zurück
Oben