Thema Datum  Von Nutzer Rating
Antwort
01.08.2023 20:11:28 Thomas
NotSolved
02.08.2023 09:41:43 Gast99002
NotSolved
02.08.2023 16:02:10 Gast98165
NotSolved
05.08.2023 15:34:00 Gast52820
NotSolved
Rot Web Scrapping
05.08.2023 10:15:57 Zwenn
NotSolved
08.08.2023 18:40:55 Thomas
NotSolved
05.08.2023 18:20:47 Gast52183
NotSolved

Ansicht des Beitrags:
Von:
Zwenn
Datum:
05.08.2023 10:15:57
Views:
236
Rating: Antwort:
  Ja
Thema:
Web Scrapping

Hallo Thomas,

kann es sein, dass Du versucht hast einen Teil des HTML Codes zu kopieren, den Du für relevant hältst? Denn genau die Zeile, aus der Du in Deinem ersten funktionierenden Beispiel den Preis ausliest, hat eine falsche HTML Syntax. Da kannst Du mit ziemlicher Sicherheit auf die gezeigte Weise den gewünschten Wert do nicht auslesen.

Ist:

<span <span style="color:#e74c3c">
        <strong>
          class="arial_26 inlineblock pid-13884-last"
        </strong>
      </span>
      id="last_last" dir="ltr">274,80
</span>

Das erste span Tag wird nicht geschlossen, bzw. erst in der vorletzten Zeile hinter dir="ltr". Damit ist alles dazwischen, ab dem zweiten span Tag, als Attribut des ersten eingebracht. Das ist aber verboten, weil Tags niemals Attribute sein können. Die beiden Zeilen class="arial_26 inlineblock pid-13884-last" und id="last_last" dir="ltr">274,80 werden komplett als auszugebende Inhalte interpretiert, was ebenfalls falsch ist. Die Attributanteile sind keinen Tags zugeordnet. Somit ist es nicht möglich mit getElementsByClassName("arial_26 inlineblock pid-13884-last") auf den Preis zuzugreifen, denn "arial_26 inlineblock pid-13884-last" ist für den Browser nur Text ohne Bedeutung.

Mögliche sinnvolle schreibweise:

<span id="last_last" dir="ltr">
  <span style="color:#e74c3c">
    <strong class="arial_26 inlineblock pid-13884-last">274,80</strong>
  </span>
</span>

Wenn id="last_last" wirklich zum erstan span Tag gehört, ist der Preis der einzige im Browser auszugebende Inhalt und Du kannst ihn abgreifen ohne auf die Class zugreifen zu müssen:

price_BYD = html.getElementByID("last_last").innerText

Auf eine ID würde ich allerdings möglichst abgesichert zugreifen, da ein Laufzeitfehler entsteht, falls die mal nicht vorhanden ist. Aber das nur als Hinweis, falls es den klassischen 424 Objekt erforderlich gibt.

Nun möchtest Du noch den Wert Kaufen auslesen (oder was sonst an der Stelle stehen kann), hast aber das Problem der wechselnden CSS Zuordnung, weil der Wert entweder in rot oder grün dastehen kann. Der Kollege, der die erste Antwort gab, hat Dich schon auf die Struktur hingewiesen, die Du ausnutzen kannst. Im Grunde habe ich es im ersten Beispiel mit der ID auch kurz erklärt.

Wenn Du mit einer der get...() Methoden auf HTML Elemente zugreifst, besteht ein Element aus der HTML Struktur zwischen dem öffnenden Tag, das über Dein gewähltes Kriterium erkannt wird und dem dazugehörigen schließendem Tag, inklusive aller HTML Zeilen dazwischen. Anschließend kannst Du mit genau diesem einen Element weiterarbeiten und bist den ganzen HTML Code davor und danach los.

Du hast also:

<div class="summaryTableLine">
  <span>Gleit. Mittelwerte:</span><span class="greenFont bold">Kaufen</span>
  <span><i class="noBold">Kaufen</i> <i id="maBuy">(8)</i></span>
  <span><i class="noBold">Verkaufen</i> <i id="maSell">(4)</i></span>
</div>

In einer Zeile kannst Du so auf den gewünschten Wert zugreifen:

available = html.getElementsByClassName("summaryTableLine")(0).getElementsByTagName("span")(1).innertext

Sofern "summaryTableLine" an der Stelle das erste Mal im Dokument auftaucht (Index 0). Ansonsten musst Du den richtigen Index rausfinden und in die runden Klammern schreiben. Für getElementsByTagName("span") stimmt der Index 1 auf jeden Fall, denn er bezieht sich ausschließlich auf den Teil der HTML Struktur, die vorher mit getElementsByClassName("summaryTableLine")(0) festgelegt wurde und der gesuchte Wert steht darin im zweiten span Tag.

Erklärungen zu WebScraping können beliebig weiter detailliert werden, weshalb meine Erklärung nur einen möglichen Weg darstellen. Der Kollege oben hat z.B. auf die Children verwiesen. Das geht auch, habe ich hier aber nicht angewendet. Vielleicht hilft Dir diese kurze Erklärung ohne weitere Hintergründe erstmal zur Lösung Deines Anliegens.

Viele Grüße,

Zwenn


Ihre Antwort
  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen
Thema: Name: Email:



  • Bitte beschreiben Sie Ihr Problem möglichst ausführlich. (Wichtige Info z.B.: Office Version, Betriebssystem, Wo genau kommen Sie nicht weiter)
  • Bitte helfen Sie ebenfalls wenn Ihnen geholfen werden konnte und markieren Sie Ihre Anfrage als erledigt (Klick auf Häckchen)
  • Bei Crossposting, entsprechende Links auf andere Forenbeiträge beifügen / nachtragen
  • Codeschnipsel am besten über den Code-Button im Text-Editor einfügen
  • Die Angabe der Emailadresse ist freiwillig und wird nur verwendet, um Sie bei Antworten auf Ihren Beitrag zu benachrichtigen

Thema Datum  Von Nutzer Rating
Antwort
01.08.2023 20:11:28 Thomas
NotSolved
02.08.2023 09:41:43 Gast99002
NotSolved
02.08.2023 16:02:10 Gast98165
NotSolved
05.08.2023 15:34:00 Gast52820
NotSolved
Rot Web Scrapping
05.08.2023 10:15:57 Zwenn
NotSolved
08.08.2023 18:40:55 Thomas
NotSolved
05.08.2023 18:20:47 Gast52183
NotSolved