Eindeutigen (CSS)-Selektor bestimmen

Wie bestimmt man für den Quelltext einer Website für alle Elemente den eindeutigen (CSS)-Selektor, am besten/einfachsten/schnellsten in Java?

Du könntest (z.B. mit jSoup) den Dom Baum rekursiv durchlaufen und bis zum gewünschten Element kommen. Je nachdem wie sauber der HTML Code ist, wird es einfacher oder schwieriger:


<div id="first">
  <div id="second">
  </div>
  <div id="third">
    <div id="i-want-this-one">
    </div>
  </div>
</div>

Hier wäre der Identifier also :root div#first div#third div#i-want-this-one.


<div>
  <div>
  </div>
  <div>
    <div> // das hier suchen
    </div>
  </div>
</div>

Hier wäre es schon schwieriger, hier wäre es :root div div:nth-child(2) div (ohne Gewähr), wenn die ids nicht gepflegt sind kann es schnell mehrdeutig werden. Wenn z.B. neben dem zu suchenden DIV hier noch ein weiteres liegen würde, würde es wieder anders aussehen.

Das größere Problem sehe ich eher darin: Wie willst du dem Java Programm denn mitteilen, für welches Element es die eindeutige ID suchen soll, ohne die eindeutige ID zu kennen?

Wenn man im Vorhinein nichts über das Dokument weiß, bleibt einem nur sozusagen den voll qualifizierten Pfad zu jedem Element als CSS-Selektor zu bauen. inv_zim hat schon skizziert, wie man das machen könnte. Von mir nur die Ergänzung, dass anstatt der Leerzeichen (irgend ein Nachfahre überall) zwischen den einzelnen Knoten das “>” (direkter Nachfahre) das Mehrdeutigkeitsproblem lösen würde.

Wenn eine ID für das Element vergeben ist, dann ist die Sachlage einfach. Für die spezifische Seite reicht dann ein #id als Selektor aus, weil IDs per Definition nicht mehrfach vorkommen dürfen.
Wenn gar keine IDs vergeben wurden, ist es schwierig. Da sehe ich nur die Möglichkeit mit dem CSS3-Selektor :nth-child() zu arbeiten und dann alle Elemente durchzuzählen.

Deshalb habe ich weiter oben geschrieben „je nachdem wie sauber der Code ist“. Per Spezifikation darf es nicht vorkommen, man trifft es aber sehr oft an, da die Renderer diesen Fehler oft verzeihen. Fehlende Closing Tags, doppelte IDs, das wird alles (mit Warnings) gerendert.