2017-11-15 4 views
1

ich HTML-Struktur haben, die wie folgt aussieht:JSoup Parsen HTML schlecht strukturierte

<h1>Title</h1> 
<h2>Subtitle</h2> 
<p>Some text</p> 
<p>Some other text</p> 

<h1>Some other title</h1> 
<h2>Another sub-title</h2> 
<p>Some other text</p> 

Grundsätzlich in einem einzigen div sie sind Artikel, aber jeder Artikel ist nicht. Was sie auszeichnet, ist das Etikett. Ich bin nur daran interessiert, die Absatztexte zu analysieren, wobei jeder Artikel eine separate Einheit sein sollte.

Worüber ich nachgedacht habe: Holen Sie sich den Container, in dem die Artikel gespeichert sind, suchen Sie den ersten h1-Tag. Beginnen Sie mit dem Parsen aller Elemente, bis wir ein anderes h1-Tag erreichen. Wenn ein neues h1-Tag erreicht ist, verarbeite die zuvor geparsten Daten und starte neu.

Aber ich fragte mich, ob eine einfachere Lösung möglich ist?

+0

FWIW, das ist schon ziemlich einfach. –

Antwort

1

Ich kann nur Ihre Lösung ein klein wenig verfeinern:

  1. alle innerhalb des Behälters h1 Elemente auswählen (und nicht nur die eins nach dem anderen Elemente des Containers gerade)
  2. Für jede h1
      passend
    1. Sammeln Sie die folgenden Geschwister bis zum ersten h1
    2. Verarbeiten Sie sie

select können Sie die h1 s (zB finden, .select("selector-for-container > h1"), dann leicht durchqueren nextElementSibling lässt Sie nach vorn von jedem h1 (oder nextSibling, aber dann müssen Sie die Nicht-Elemente auszusondern sich   — natürlich, Wenn Artikelinhalt nicht in einem p ist, möchten Sie dies für die Textknoten).

+0

Ich dachte über etwas wie eine getElementsBetween-Methode nach, bei der ich als Argumente zwei Elementobjekte (jedes Paar von h1-Tags) angeben würde - Gibt es eine solche vorgefertigte Methode in JSoup? – i712345

+0

@ i712345: Ich sehe keinen in den API-Dokumenten. (Ich hatte gehofft, es würde einen geben, wie jQuerys 'nextUtil'.) –

+1

Ich denke, es ist ziemlich schön für eine Pull-Anfrage :) Danke für deine Hilfe. – i712345