Mit Regex aus HTML Quellcode mehrere Zeile extrahieren...

P

pks85

Aktives Mitglied
Thread Starter
Dabei seit
16.07.2004
Beiträge
1.158
Reaktionspunkte
5
Hallo!
Folgendes: Ich will aus einer HTML die Zeilen ab einer bestimmten Zahlenkombination bis zu einem <tr> raussuchen, also sowas:
Code:
<table>
<tr>
<td>12345</td>
<td>12</td>
<td>123</td>
</tr>
<tr>
<td>54321</td>
<td>21</td>
<td>321</td>
</tr>
</table>
und rauskommen soll das:
Code:
<td>12345</td>
<td>12</td>
<td>123</td>
</tr>

Hab es so probiert:
Code:
^.*12345.*$(^.*$)+^.*tr.*$
das funktioniert aber irgendwie nicht :)

Das da:
Code:
^.*12345.*$
funktioniert, gibt aber eben nur die Zeile aus in der "12345" steht.

Bin was regex angeht sehr unerfahren, daher bitte ich um Mithilfe. :)

Danke schonmal!
 
versuch es mal mit :
/<tr>([.*[^(<tr>)]])<\/tr>/

weiß jetzt aber nicht ob das geht, musst du ausprobieren.
 
Zuletzt bearbeitet:
Danke, aber funktioniert nicht - das regex soll ja eigtl. auch nur die Zeilen ab der Zahlenkombination 12345 bis zum nächsten </tr> suchen.
 
Achso, und was ist hiermit:

/<td>12345<td>((<td>[\w\s]*<td>)*)<\/tr>/

Natürlich können dann in den <td> s keine Sonderzeichen vorkommen.
 
Hm, damit bekomm ich auch keine Ergebnisse. Kann es sein, dass man da noch was einbauen muss, damit der auch neue Zeilen und Whitespaces beachtet?
die Datei sieht konkret so aus:
Code:
<tr>
    <td>12345</td>
    <td>12</td>
    <td>bla</td>
</tr>
 
pks85 schrieb:
Hm, damit bekomm ich auch keine Ergebnisse. Kann es sein, dass man da noch was einbauen muss, damit der auch neue Zeilen und Whitespaces beachtet?
die Datei sieht konkret so aus:
Code:
[/QUOTE]

*hustel* Ja eigendlich schon. :D

Hab einfach \s? hinter die <td> s hinzugefügt.
\s = [\f\t\n\r ]
? = optional
 
Funktioniert immer noch nicht :)
Kann leider nix dazu sagen, da ich dein regex garnicht verstehe :D (wie gesagt bin Anfänger!)

Aber ich probier das halt hier: http://regxlib.com/RETester.aspx
aus, und er sagt "No Matches" wenn das:
Code:
<tr>
    <td>12345</td>
    <td>12</td>
    <td>bla</td>
</tr>
Source ist und das:
Code:
/<td>12345<td>\s?((<td>[\w\s]*<td>\s?)*)<\/tr>/
das Regex.

Dieses Zeug verwirrt mich mehr und mehr... :>
 
Ok jetzt reichts. Vorhin hab ich meine Hausaufgaben geschrieben. Jetzt hab ich extra ein Perl Skript geschrieben dafür:
Code:
#! /usr/bin/perl
use strict;

open DATEI, "./test_datei" or die "Coudn't open the test_datei: $!";
my @datei = <DATEI>;
close DATEI;

#print @datei;

my $datei;
foreach (@datei) {
    $datei .= $_;
}

if($datei =~/(<td>12345<\/td>\s?((<td>[\w\s]*<\/td>\s?)*)<\/tr>)/) {
    print "$1\n";
} else {
    print "\nNo Match\n";
}

in der Datei "test_datei" befindet sich folgendes:
<table>
<tr>
<td>12345</td>
<td>12</td>
<td>123</td>
</tr>
<tr>
<td>54321</td>
<td>21</td>
<td>321</td>
</tr>
</table>

Ergebnis:
<td>12345</td>
<td>12</td>
<td>123</td>
</tr>


So und jetzt geh ich eine Runde Basketball spielen. :D
 
Zuletzt bearbeitet:
Gibts ja nicht - funktioniert! ;D

Vielen Dank für deine Mühe!!!

Gruß,pks

p.s.: viel Spaß beim bb! :)
 
So, jetzt wollte ich das eigtl. in python machen - exakt der gleiche regex bringt da keine Ergebnisse... :'(
Code:
#!/usr/bin/python
import re

f = open ("./test_datei", "r").readlines()

res = re.compile('/(<td>12345<\/td>\s?((<td>[\w\s]*<\/td>\s?)*)<\/tr>)/')

for line in f:
	if res.search(line) is not None:
		print line
 
Zuletzt bearbeitet:
pks85 schrieb:
So, jetzt wollte ich das eigtl. in python machen - exakt der gleiche regex bringt da keine Ergebnisse... :'(
Code:
#!/usr/bin/python
import re

f = open ("./test_datei", "r").readlines()

res = re.compile('/(<td>12345<\/td>\s?((<td>[\w\s]*<\/td>\s?)*)<\/tr>)/')

for line in f:
	if res.search(line) is not None:
		print line

Hättest du vorher sagen müssen. :) Kenne mich mit Python leider überhaupt nicht aus. Hab mal kurz gegooglt und da fand ich unteranderem dies .
die / Slashs am Anfang und am Ende markieren bei Perl den Anfang und das Ende des Regex Teils. Die brauchst du bei Python nicht. Auch muss man bei Perl die Slashs die in der Expression stehen extra schützen damit sie nicht als Ende anerkannt werden. Das tut man mit einem Backslash \.
Jetzt versuch mal was passiert wenn du die weglässt. Wäre dann wie folgend:
re.compile('(<td>12345</td>\s?((<td>[\w\s]*</td>\s?)*)</tr>)')
 
Ich wollte gerade fragen: In welcher Sprache soll das denn sein?

Suchen über Zeilenumbrüche hinweg wird von den Sprachen teilweise unterschiedlich gemacht.

Da musst Du da mal die entsprechende Doku lesen, denn auch ich kenne Python nicht besonders gut.

Gruss

Alex
 
below schrieb:
Suchen über Zeilenumbrüche hinweg wird von den Sprachen teilweise unterschiedlich gemacht.

Da musst Du da mal die entsprechende Doku lesen, denn auch ich kenne Python nicht besonders gut.
\s enthält ja normalerweise auch Zeilenumbrüche, also muss das auch bei Python funktionieren da /s ja von Regex stammt und nicht von Perl.

Hab jetzt auch nocheinmal hier nachgeschaut. Hab den Link schon vorhin gepost. Da steht:

\s
Matches any whitespace character; this is equivalent to the class [ \t\n\r\f\v].

und auch noch:
The solution is to use Python's raw string notation for regular expressions; backslashes are not handled in any special way in a string literal prefixed with "r", so r"\n" is a two-character string containing "\" and "n", while "\n" is a one-character string containing a newline. Frequently regular expressions will be expressed in Python code using this raw string notation.
 
So, habs jetzt irgendwie hingekriegt:
Code:
#!/usr/bin/python
import re

f = open ("./test_datei", "r").read()

res = re.compile('.*12345.*\n(\t\t<td>.*\n)*')

q = re.search(res, f)

print q.group()

in test_datei steht das:
Code:
<table>
	<tr>
		<td>12345</td>
		<td>12</td>
		<td>12</td>
		<td>123</td>
	</tr>
	<tr>
		<td>54321</td>
		<td>21</td>
		<td>321</td>
	</tr>
</table>
juhu! :D

Ach übrigens, ein praktisches Tool für regexes:
http://python.net/~gherman/RegexPlor.html
 
Zuletzt bearbeitet:
Zurück
Oben Unten