HTML Tabelle --> Array

05/06/2012 22:25 Achat#1
Quote:
Originally Posted by Achat View Post
Kann mir jemand beim einlesen einer Tabelle in einen Array helfen?

Und zwar möchte ich die Tabelle von [Only registered and activated users can see links. Click Here To Register...] in ein zweidimensionales Array einlesen.

HTML: [Only registered and activated users can see links. Click Here To Register...]
(passt nicht in den Thread, ist zu groß)

Ein Tipp wie ich da am besten anfangen kann, wäre nett, denn bei so einer großen Datenmenge verliert man schnell den Überblick. :o

Danke.

MfG
Quote:
Originally Posted by Lawliet! View Post
Für sowas dann evl. doch nen Thread aufmachen ^^ Kann mir vorstellen, dass das ne große parsing Geschichte wird.
Hat jemand eine Idee?
Mein Ziel ist es, wie oben schon genannt, alles in einen Array einzulesen.

also
Code:
global $asSectionMods[1][2] = [['Sectionname','Mods']]
Vielen Dank im Voraus.

MfG
05/07/2012 13:30 lolkop#2
Code:
Func BuildSectionModArray()
	Local $regexp = StringRegExp(BinaryToString(InetRead("http://j.mp/mods-sections")), 'target="_blank">([^/]*?)<\/a><\/td><td><a href=.*? target="_blank">(.*?)<\/a> <\/td>', 3), $array[UBound($regexp)/2][2]
	For $i=0 To UBound($regexp)-1 Step 2
		$array[$i/2][0] = $regexp[$i]
		$array[$i/2][1] = StringRegExpReplace($regexp[$i+1], '<\/a> <a href=.*? target="_blank">', ', ')
	Next
	Return $array
EndFunc
05/07/2012 18:27 Achat#3
Danke, das hat mir sehr geholfen.

Ich würde außerdem noch gerne die Links zu den Profilen der Mods in den Array einlesen, habe hier schon selbst was versucht (kenne mich mit RegExp nicht so aus -.-):

Code:
#include <Array.au3>

$asSectionMod=BuildSectionModArray()
_ArrayDisplay($asSectionMod)

Func BuildSectionModArray()
	Local $array,$i
	Local $regexp = StringRegExp(BinaryToString(InetRead("http://j.mp/mods-sections")), 'target="_blank">([^/]*?)<\/a><\/td><td><a href=.*? target="_blank">(.*?)<\/a> <\/td>', 3), $array[UBound($regexp)/2][3]
	FileWrite('regexp.txt',$regexp)
	For $i=0 To UBound($regexp)-1 Step 2
		$array[$i/2][0] = $regexp[$i]
		$array[$i/2][1] = StringReplace(StringRegExpReplace($regexp[$i+1], '<\/a> <a href=.*? target="_blank">', ', '),'&amp','')
	Next
	_ArrayDisplay($array)

	Local $regexp = StringRegExp(BinaryToString(InetRead("http://j.mp/mods-sections")), '<a href="(http://www.elitepvpers.com/forum/members/\d.*?.html)" target="_blank">(.*?)</a>', 3)
ReDim $array[Ubound($array)+Ubound($regexp)][3]
for $i = 0 to UBound($regexp)-1 step 2
	$array[$i/2][2]=$regexp[$i]
Next

	Return $array
EndFunc
Es werden zwar Links zu den Profilen zurückgegeben, aber leider stimmen die nicht mit dem Namen überein. Wäre cool, wenn du mir da auch noch helfen könntest.

Vielen Dank im Voraus.

MfG
05/07/2012 18:30 Lawliet#4
Kannst du theoretisch mit StringinStr() raussuche ;)
05/07/2012 18:56 Achat#5
Quote:
Originally Posted by Lawliet! View Post
Kannst du theoretisch mit StringinStr() raussuche ;)
Aber die Namen sind nicht immer in der Url zum Profil. Also geht das wohl nicht.



Code:
#include <Array.au3>
#include <String.au3>

$asSectionMod=BuildSectionModArray()
_ArrayDisplay($asSectionMod)

Func BuildSectionModArray()
	local $asSource[1]=[BinaryToString(InetRead("http://j.mp/mods-sections"))]
;~ 	Local $asSource=_StringBetween($sSource,'<img src="http://www.elitepvpers.com/forum/images/teamicons/relaunch/moderator.png" border="0" alt="" class="tcattdimgresizer"','by StG')
	Local $array[1000][3],$i
	Local $regexp = StringRegExp($asSource[0], 'target="_blank">([^/]*?)<\/a><\/td><td><a href=.*? target="_blank">(.*?)<\/a> <\/td>', 3)
	FileWrite('regexp.txt',$regexp)
	For $i=0 To UBound($regexp)-1 Step 2
		$array[$i/2][0] = $regexp[$i]
		$array[$i/2][1] = StringReplace(StringRegExpReplace($regexp[$i+1], '<\/a> <a href=.*? target="_blank">', ', '),'&amp','')
	Next
	_ArrayDisplay($array)


;~ 	Local $regexp = StringRegExp($asSource[0], '<a href="(http://www.elitepvpers.com/forum/members/\d.*?.html)" target="_blank">(.*?)</a>', 3)
for $i = 0 to UBound($array,2)-1
	 $regexp[$i] = StringRegExp($asSource[0], '</a></td><td><a href="(http://www.elitepvpers.com/forum/members/\d.*?.html)" target="_blank">('&$array[$i][1]&')</a>', 3)
Next

;~ ReDim $array[Ubound($array)+Ubound($regexp)][3]
for $i = 0 to UBound($regexp)-1 step 2
	$array[$i/2][2]=$regexp[$i]
Next

	Return $array
EndFunc
Also irgendwas mache ich da falsch....

Ich möchte noch den Link zum Modprofil auslesen, z.B.
HTML Code:
<a href="http://www.elitepvpers.com/forum/say-hello/" target="_blank">Say Hello</a></td><td><a href="[B]http://www.elitepvpers.com/forum/members/2204104--status.htm[/B]l" target="_blank">°Status</a>
MfG
05/07/2012 19:09 Freddy​#6
_StringBetween()
05/07/2012 20:55 Achat#7
EDIT

Kann geschlossen werden,

Bekomme das hier zurück: [Only registered and activated users can see links. Click Here To Register...] :)

MfG

Danke nochmal an alle, die sich am Thread beteiligt haben.

EDIT4:

Also es funktioniert, aber in manchen Teilen der Tabelle gibt es mehr als einen Mod, meine Funktion
Code:
Func _EPVP_STAFF()
	local $sHTML=BinaryToString(InetRead("http://j.mp/mods-sections"))
	local $asTable=_StringBetween($sHTML,'<img src="http://www.elitepvpers.com/forum/images/teamicons/relaunch/moderator.png" border="0" alt="" class="tcattdimgresizer" ','by StG')
	$sHTML=$asTable[0]
	Local $asRegexp = StringRegExp($sHTML, '<a href=(.*?) target="_blank">([^/]*?)</a></td><td><a href="(.*?).html" target="_blank">([^/]*?)</a>', 3)
	local $asReturn[Ubound($asRegexp)][4],$iLoop,$asReturnFormatted[1][4] =[['ThreadLink','ThreadName','ModProfileLink','ModName']]
	for $i = 0 To UBound($asRegexp)-5 step 4
		$asThreadLink=_StringBetween($asRegexp[$i],'<a href="','"')
		$asThreadLink=StringRegExp($asRegexp[$i],'http://www.elitepvpers.com/forum/[^members](.*)',3)
		If IsArray($asThreadLink) Then
		$asReturn[$i][0]='http://www.elitepvpers.com/forum/'&$asThreadLink[0]
		EndIf
		$asReturn[$i][1]=StringReplace($asRegexp[$i+1],'&amp','')
		$asReturn[$i][2]=$asRegexp[$i+2]
		$asReturn[$i][3]=StringReplace(StringReplace($asRegexp[$i+3],'Α','A'),'Crαnk','')
	Next
	for $i=0 to UBound($asReturn)-1
	If $asReturn[$i][0] <> '' And $asReturn[$i][1] <> '' and $asReturn[$i][2] <> '' and $asReturn[$i][3] <>'' Then
		Redim $asReturnFormatted[UBound($asReturnFormatted,1)+1][4]
		$asReturnFormatted[Ubound($asReturnFormatted)-1][0]=$asReturn[$i][0]
		$asReturnFormatted[Ubound($asReturnFormatted)-1][1]=$asReturn[$i][1]
		$asReturnFormatted[Ubound($asReturnFormatted)-1][2]=$asReturn[$i][2]
		$asReturnFormatted[Ubound($asReturnFormatted)-1][3]=$asReturn[$i][3]
	EndIf
	Next
	Return $asReturnFormatted
	;$asReturn[$x][0]=Threadlink
	;$asReturn[$x][1]=Threadname
	;$asReturn[$x][2]=Modlink
	;$asReturn[$x][3]=Modname
EndFunc
gibt aber immer nur den ersten Mod zurück, der in der Tabelle steht - wie kann ich die Modnamen & ModUrls von allen Mods in einer Zeile auslesen?

MfG
05/08/2012 00:02 lolkop#8
Code:
#include <array.au3>
$array = BuildSectionModArray()
_ArrayDisplay($array)

Func BuildSectionModArray()
	Local $regexp = StringRegExp(BinaryToString(InetRead("http://j.mp/mods-sections")), 'target="_blank">([^/]*?)<\/a><\/td><td>(.*?) <\/td>', 3), $array[UBound($regexp)/2][3]
	For $i=0 To UBound($regexp)-1 Step 2
		Local $mod = ArrayToString(StringRegExp($regexp[$i+1], '<a href="(.*?)" target="_blank">(.*?)</a>', 3))
		$array[$i/2][0] = $regexp[$i]
		$array[$i/2][1] = $mod[0]
		$array[$i/2][2] = $mod[1]
	Next
	Return $array
EndFunc

Func ArrayToString($array)
	Local $string[2]
	For $i=0 To UBound($array)-1 Step 2
		$string[1]&=$array[$i]&', '
		$string[0]&=$array[$i+1]&', '
	Next
	Local $return[2]=[StringTrimRight($string[0],2),StringTrimRight($string[1],2)]
	Return $return
EndFunc
die arraytostring funktion ist eigentlich überflüssig, und braucht man so natürlich nicht (deshalb auch sehr ineffizient, aber kurz und bündig geschrieben). wollte nur alles sauber gepresst für die _ArrayDisplay funktion ausgeben =)
05/15/2012 20:49 Achat#9
Danke!

Ich habe jetzt selbst mal was ausprobiert:

Code:
Func _EPVP_STAFF()
	local $iSize,$asReturn1[1][4]
	Local $sHTML = _InetReadWinHttp('elitepvpers.com', 'forum/main/1421118-elitepvpers-staff-overview.html')
	Local $asRegexp = StringRegExp($sHTML, '<a href="(.*?)" (target="_blank">[^/].*?</a>)</td><td>(<a href=".*?.html)" (target="\w*?">.*?</a>) </td></tr>', 3), $asReturn[UBound($asRegexp)][4]
	;<a href="http://www.elitepvpers.com/forum/say-hello/" target="_blank">Say Hello</a></td><td><a href="(http://www.elitepvpers.com/forum/members/.*)" target="_blank">°Status</a> </td></tr>
	;[5]|http://www.elitepvpers.com/forum/ion-hacks-bots-cheats-exploits/"|Aion Hacks, Bots, Cheats ; Exploits|http://www.elitepvpers.com/forum/members/296414-darkopm.html|http://www.elitepvpers.com/forum/members/296414-darkopm
	_ArrayDisplay($asRegexp)
;~ ReDim $asReturn[Ubound($asReturn)/4]
	For $i = 0 To UBound($asReturn) - 5 Step +4
;~ 		If $i = 0 Then ReDim $asReturn[Round(Ubound($asReturn)/4)][3]
		$asReturn[$i / 4][0] = $asRegexp[$i]
		Local $asArrayThreadName = StringRegExp($asRegexp[$i + 1], 'target="_blank">([^/].*?)</a>', 3)
		Local $asArrayModLink = StringRegExp($asRegexp[$i + 2], 'href="(.*\.html)?', 3)
		Local $asArrayModName = StringRegExp($asRegexp[$i + 3], 'target="_blank">(.*?)</a>', 3)
		$asReturn[$i / 4][1] = StringReplace(StringReplace(_ArrayToString($asArrayThreadName, ','),'<b>',''),'</b>','')
		$asReturn[$i / 4][2] = _ArrayToString($asArrayModLink, ',')
		$asReturn[$i / 4][3] = _ArrayToString($asArrayModName, ',')
	Next
	local $sReturn1
	$i=0
Do ;Leere Zeilen werden gelöscht
ReDim $asReturn1[Ubound($asReturn1)+1][4]
$asReturn1[$i][0]=$asReturn[$i][0]
$asReturn1[$i][1]=$asReturn[$i][1]
$asReturn1[$i][2]=$asReturn[$i][2]
$asReturn1[$i][3]=$asReturn[$i][3]
$i+=1
until $asReturn[$i][0] =''
	Return $asReturn1
	;$asReturn[$x][0]=Threadlink
	;$asReturn[$x][1]=Threadname
	;$asReturn[$x][2]=Modlink
	;$asReturn[$x][3]=Modname
EndFunc   ;==>_EPVP_STAFF
Es funktioniert auch soweit alles. Aber wenn es in einer Section mehrere Mods gibt, bekomme ich immer nur eine URL zu einem Modprofil. Die Namen der anderen Mods werden zwar angezeigt, aber nicht deren URL. Was kann man da machen? Geht das überhaupt in einem RegExp oder werden wie bei Lolkop's Beispiel zwei benötigt?

[IMG][Only registered and activated users can see links. Click Here To Register...][/IMG]


MfG
05/15/2012 21:23 lolkop#10
mein beispielcode funktionierte doch soweit? o0
05/15/2012 21:24 Achat#11
Danke für deine Antwort.
Ja, wollte es aber auch mal selbst ausprobieren, um zu lernen ;)
Was mache ich falsch?

MfG
05/15/2012 22:14 lolkop#12
Quote:
Originally Posted by Achat View Post
Es funktioniert auch soweit alles. Aber wenn es in einer Section mehrere Mods gibt, bekomme ich immer nur eine URL zu einem Modprofil. Die Namen der anderen Mods werden zwar angezeigt, aber nicht deren URL. Was kann man da machen? Geht das überhaupt in einem RegExp oder werden wie bei Lolkop's Beispiel zwei benötigt?
das mit den mods hatte nur funktioniert, weil ich den rest einfach gelöscht habe.

in der realität will man ja aber ohnehin nicht etwa einen string der modnamen, durch komma getrennt erhalten, sondern ein array von mods (im bestenfall als 2d array inclusive ihrer urls).
wie bereits gesagt hatte ich die funktion mit dem string nur eingebaut, um das ganze schöner ausgeben zu können.

das ganze in einem einzigen befehl auslesen kann deshalb nicht funktionieren, da selbst wenn man es bewerkstelligen könnte, die anzahl unbekannt wäre, und man das ganze nicht wie in meinem beispiel sortieren könnte...

das hauptarray bei meinem beispiel sieht ja so aus:
Code:
[0] = Sektion 0
[1] = string von mods und links 0
[2] = Sektion 1
[3] = string von mods und links 1
[4] = Sektion 2
[5] = string von mods und links 2
[...]
so lässt sich das ganze ja einfach wie in meinem beispiel mit einer for schleife zusammen sortieren.
Code:
[$i*2] entspricht jeweils einer Sektion für alle natürlichen zahlen ab 0, da dies die geraden zahlen sind
[$i*2+1] ist jeweils der nachfolger und somit der string von mods und links
würden wir aber die mods und strings mit einlesen, erhielten wir soetwas:
Code:
[0] = Sektion 0
[1] = link 0
[2] = mod 0
[3] = Sektion 1
[4] = link 1
[5] = mod 1
[6] = link 1
[7] = mod 1
[8] = link 1
[9] = mod 1
[10] = Sektion 2
[11] = link 2
[12] = mod 2
[13] = Sektion 3
[...]
da wir nun nicht wissen, wieviele mods und links wir pro sektion erhalten, können wir unmöglich anfangen das ganze in ein array zu sortieren.
05/15/2012 23:33 Lawliet#13
Man kann aber die URL aufrufen und die Modanzahl auslesen ;)
05/16/2012 09:45 lolkop#14
Quote:
Originally Posted by Lawliet! View Post
Man kann aber die URL aufrufen und die Modanzahl auslesen ;)
da ist es immernoch wesentlich effizienter das ganze über 2 regexp befehle auszulesen, bevor man mehrere seiten läd :P
05/17/2012 01:58 Achat#15
Quote:
Originally Posted by Lawliet! View Post
Man kann aber die URL aufrufen und die Modanzahl auslesen ;)
Quote:
Originally Posted by lolkop View Post
da ist es immernoch wesentlich effizienter das ganze über 2 regexp befehle auszulesen, bevor man mehrere seiten läd :P
Die Modanzahl von jeder Sektion abzurufen würde lange dauern, aber dafür ist sie dann auch aktuell.
In dem epvp staff Thread steht Lawliet! noch nicht als Moderator drin. :(

MfG