HTML-Element-IDs nicht eindeutig ?!?!?

Hallo,

vorab muss ich gestehen, dass ich von HTML nicht wirklich viel Ahnung habe. Dennoch lese ich via Excel Webseiten, also die HTML-Elemente aus.

Bisher hab ich immer gedacht, dass die IDs der HTML-Elemente eindeutig wären. Das muss  aber offensichtlich nicht immer so sein. Selbst in der Microsoft-Library zu „HtmlDocument.GetElementById-Methode“ wird der Hinweis gegeben: „Wenn mehrere Elemente im Dokument den gleichen ID-Wert haben, wird durch GetElementById das erste zurückgegeben, das gefunden wird.“ Ja ich weiß, guter Programmierstil etc, es sollte usw…
Leider bringt mich an dieser Stelle „es sollte…“ nicht wirklich weiter.

Ich suche also eine Möglichkeit, dass zweite HTML-Element (mit der identischen ID) anzusprechen und zwar über Excel-VBA. Leider gibt es keine weiteren für eine schnelle Suche geeigneten Unterscheidungskriterien. Alle Elemente des ganzen Dokuments zu durchlaufen, möchte ich ungern (wg. Zeit).

Also, hat jmd. eine Idee, wie ich das 2. Element ansprechen kann???

Für eure Hilfe schon mal vielen Dank im Voraus.

Jörg

Hallo,

erstmal Fragst Du bei HTML CSS ,
wobei deine Frage irgendwie JavaScript ist .

zweitens scheinst Du schon einen VBA schnippsel zu haben ,
aber wie immer bleibt das wichtigste geheim.

Drittens wenn getElemtenById mehrere Werte liefert , ist es genauso
wie bei getElementByName , es wird ein Array .

Viertens könntest Du auch mit VBA die ID’s im HTML Dokument ändern .

Fünftens weiss immer noch keiner wie du das genazu einliesst in VBA (mit Assistent Aufzeichnung ??)

Sechstens ist es tatsächlich so das eine konforme Datei eigentlich nur eindeutige ID’s haben sollte . Hier wäre echt mal Die frage, wer so ein antiHTML produziert. Es wäre deutlich schlauer wenn man die Ausgangsmaterialien konform Gestaltet und nicht anders rum.

Lösung gibts ansonsten keine weil ohne Sachlichen code , gibts wieder 1000 Möglichkeiten.#

Hoffe auf CodeSchnippsel bzw Beschreibeung wie vorgegangen wird. Drittens woher und warum kommen die HTML Dokumente so falsch an ?

Gruß TechPech

HalloTechPech,

  1. Mag sein, dass die Erzeugung der Webseite was mit JavaScript zu tun hat… Wie gesagt, kenne mich da nicht wirklich aus… Aber ist es letztendlich nicht egal, wie Webseiten-Elemente erzeugt werden? Für mich ist es halt nur wichtig die Webseite auszulesen.

  2. Ja hab ich. Allerdings weiß ich nicht, was das bringen soll, da es um eine allgemeine Frage geht: Vorhandensein identischer IDs und Ansprechen der Elemente. Aber falls es hilft:
    Sub RedundanteIDs()
    Dim objIE As Object
    Dim objElement As Object
    Set objIE = CreateObject(„InternetExplorer.Application“)
    objIE.Visible = True
    objIE.navigate „www.kleinanzeigen.ebay.de
    'ggf. Einloggen, auf „Anzeigen aufgeben“ gehen und bis Rubrik „Auto…/Autos/Audi“ klicken,
    'so dass die Modelle erscheinen -> dann die MsgBox bestätigen
    MsgBox „Jetzt navigieren…“
    For Each objElement In objIE.document.all
    If objElement.ID = „cat_80“ Then Debug.Print objElement.innertext
    Next
    Debug.Print „**********************“
    Debug.Print objIE.document.getelementbyid(„cat_80“).innertext
    Set objIE = Nothing
    End Sub

  3. Nein, „getElemtenById“ liefert nur einen Wert, den ERSTEN mit der Id. Es wird also nicht wie bei „getElemtensByName“ zu einem Array.

  4. Keine Ahnung, ob und wie das geht. Außerdem wären dass dann je redundante ID eine spezielle Ausnahmebehandlung. Dann könnte ich auch das ganze per for…each-Schleife auslesen und dort abfragen. Das ist aber nicht gewollt.

  5. Siehe Code unter Punkt 2.

  6. Mein Reden… Aber ich glaube nicht, dass man da weit mit kommt (siehe URL) :wink:

So, ich hoffe, dass nun alle Angaben vorliegen. Falls nicht, einfach noch mal posten.

Danke
Jörg

Hallo

  1. Mag sein, dass die Erzeugung der Webseite was mit
    JavaScript zu tun hat… Wie gesagt, kenne mich da nicht
    wirklich aus… Aber ist es letztendlich nicht egal, wie
    Webseiten-Elemente erzeugt werden? Für mich ist es halt nur
    wichtig die Webseite auszulesen.

der befehl getElementByID ist JAVASCRIPT …

  1. Ja hab ich. Allerdings weiß ich nicht, was das bringen
    soll, da es um eine allgemeine Frage geht: Vorhandensein
    identischer IDs und Ansprechen der Elemente. Aber falls es
    hilft:

wenn ich dich Frage wie ich am Auto weiterbasteln soll , wäre es nur sinnvoll zu wissen was für ein Auto vor allem welche marke , denn alles was ich dann hole muss ja auch für dieses auto passen .

Sub RedundanteIDs()
Dim objIE As Object
Dim objElement As Object
Set objIE = CreateObject(„InternetExplorer.Application“)
objIE.Visible = True
objIE.navigate „www.kleinanzeigen.ebay.de
'ggf. Einloggen, auf „Anzeigen aufgeben“ gehen und bis Rubrik
„Auto…/Autos/Audi“ klicken,
'so dass die Modelle erscheinen -> dann die MsgBox bestätigen
MsgBox „Jetzt navigieren…“
For Each objElement In objIE.document.all
If objElement.ID = „cat_80“ Then Debug.Print
objElement.innertext
Next
Debug.Print „**********************“
Debug.Print objIE.document.getelementbyid(„cat_80“).innertext
Set objIE = Nothing
End Sub

Ok , nun weiss ich auch wie Du vorgehen tust

  1. Nein, „getElemtenById“ liefert nur einen Wert, den ERSTEN
    mit der Id. Es wird also nicht wie bei „getElemtensByName“ zu
    einem Array.

das ist schade , hätte aber sein können .

  1. Keine Ahnung, ob und wie das geht. Außerdem wären dass dann
    je redundante ID eine spezielle Ausnahmebehandlung. Dann
    könnte ich auch das ganze per for…each-Schleife auslesen und
    dort abfragen. Das ist aber nicht gewollt.

redundant ??? Ja jetzt wo ich dein code sehe ist es tatsächlich redundant bzw auch nicht, weil so wie es ist, funktioniert es ja nur für das erste element. Und da dein getelemntByid kein array liefert, würde ich gerne von Dir wissen wie willst du es denn sont lösen ??? , erstmal alles in die richtige form bringen , dann bearbeiten. das nennt sichnciht redundant sondern formalisieren .

  1. Siehe Code unter Punkt 2.

ok

  1. Mein Reden… Aber ich glaube nicht, dass man da weit mit
    kommt (siehe URL) :wink:

ok , du nimmst also fremde webseiten , haste nix von gesagt, du hast nur von HTML dateien gesprochen und diese können durchaus via email anhang komen.

So, ich hoffe, dass nun alle Angaben vorliegen. Falls nicht,
einfach noch mal posten.

Jup , aber wie gesagt erst formalisieren und dann einlesen , das du dann logisch zweimal dieselbe datei einlieest , oder das intern machst ist klar , aber denk daran , wenn die möglichkeit nicht direkt funktioniert, dann musst du halt so arbeiten .

Ich kenne nun VBA nicht genau (voll lange her) , in php und perl würde ich mit match arbeiten , da ist die ID die gleich ist sogar von Vorteil .

regexp z.b.

/(

ups da war statt klammer ein slash , sorry

/(

Hallo,

der befehl getElementByID ist JAVASCRIPT …

ah, okay, wusste nicht, dass das ein JS-Befehl ist, verwende ihn halt in VBA - von JavaScript hab ich keine Ahnung.

wenn ich dich Frage wie ich am Auto weiterbasteln soll , wäre
es nur sinnvoll zu wissen was für ein Auto vor allem welche
marke , denn alles was ich dann hole muss ja auch für dieses
auto passen .

Naja… so n bisschen hinkt der Vergleich, finde ich. Wenn ich dich nach einer Straße frage, ist es auch nicht notwendig zu wissen, welches Auto ich fahre. Aber sei es drum… Hab den Code ja gepostet.

redundant ??? Ja jetzt wo ich dein code sehe ist es
tatsächlich redundant bzw auch nicht, weil so wie es ist,
funktioniert es ja nur für das erste element. Und da dein
getelemntByid kein array liefert, würde ich gerne von Dir
wissen wie willst du es denn sont lösen ??? , erstmal alles in
die richtige form bringen , dann bearbeiten. das nennt
sichnciht redundant sondern formalisieren .

Ja, recht haste… „redundant“ ist der falsche Ausdruck. Es handelt sich ja um verschiedene Elemente, haben halt nur die selbe ID.
Danke, dass du das von mir wissen willst. Hätt ich ne Lösung dafür, hätt ich hier die Frage nicht gestellt.
Was meinst du mit „in die richtige Form bringen“? Steh da gerade auf n Schlauch.

ok , du nimmst also fremde webseiten , haste nix von gesagt,
du hast nur von HTML dateien gesprochen und diese können
durchaus via email anhang komen.

Okay, die Info, dass es sich um Internet-Webseiten handelt fehlte, sry dafür.

Jup , aber wie gesagt erst formalisieren und dann einlesen ,
das du dann logisch zweimal dieselbe datei einlieest , oder
das intern machst ist klar , aber denk daran , wenn die
möglichkeit nicht direkt funktioniert, dann musst du halt so
arbeiten .

Ich kenne nun VBA nicht genau (voll lange her) , in php und
perl würde ich mit match arbeiten , da ist die ID die gleich
ist sogar von Vorteil .

regexp z.b.

/(

Hallo Jörg,

wer hat das denn mit den gleichbenannten IDs verbrochen? Wenn du das warst, dann ändere das einfach im HTML-Code. Für Gleichbenennungen ist das class-Attribut da.

Schöne Grüße

Mohamed.

Hallo Mohamed,

wer hat das denn mit den gleichbenannten IDs verbrochen?

eBay-Kleinanzeigen :wink:

Gruß
Jörg

Hallo Mohamed,

wer hat das denn mit den gleichbenannten IDs verbrochen?

eBay-Kleinanzeigen :wink:

Unglaublich. Du könntest eine Funktion schreiben, die alle Elemente durchgeht und sich ihre IDs anschaut und dann das Element mit der x-ten ID zurückgibt.

Schema: getElmById(elm, id, index)

Schöne Grüße

Mohamed.

hallo,

da will wohl sonst keiner drauf antworten, vielleicht hats sich auch erledigt.
Nun die hilfreiche Gemeinde fragt sich da schon was das soll, die Anfrage scheint ziemlich sinnfrei zu sein - eine Übungsaufgabe vielleicht?

Um für eine Antwort motiviert zu sein, möchte man schon wissen, welches Problem (falls es ein solches gibt) man da lösen will.
Z.B. Man will die Ergebnisseiten einer Website nach bestimmten Elementen durchsuchen, um entsprechende Inhalte in einer Excel-Spalte anzuzeigen.
Diese Elemente sind wohl mit einem bestimmten ID-Attribut gekennzeichnet (auch wenn’s der HTML-Philosphie widerspricht).
Und: diese Elemente entsprechen einem bestimmten „tag“ (der Begriff hinter dem "

Nachtrag: dass schon einige vor mir geantwortet haben, war für mich nicht sichtbar.
Max.

aus dem source code (Re^2):

For Each objElement In objIE.document.all
If objElement.ID = „cat_80“ Then Debug.Print objElement.innertext
Next
Debug.Print „**********************“
Debug.Print objIE.document.getelementbyid(„cat_80“).innertext

das 1. debug.print bringt doch schon alle Einträge. Wozu nochmal getelementbyid? (was ja nur das erste bringt)

Max.

Hallo Mohamed,

Ja, das wollte ich eigentlich vermeiden, aber es geht wohl nicht anders. Danke

VG Jörg

Hallo Max,

ja, das mit der for each-Schleife wollte ich eigentlich vermeiden, aber geht wohl nicht anders…:frowning:

Danke

VG
Jörg

Hallo Max,

der Code war „nur“ zum Testen und sollte zeigen, dass es a) mehrere identische IDs gibt und b) mit getElementbyID() nur auf das erste Element zugegriffen wird.

Ich wollte gern das 2. Element DIREKT ansprechen, ohne for each - Schleife, aber das geh wohl nicht.

VG Jörg