HTML/XPath-Library
-
Ich suche eine möglichst leichgewichtige HTML-Library mit zumindest rudimentärer XPath-Unterstützung. Benötigte Features sind lediglich Parsen eines HTML-Dokuments mit anschließendem Zugriff auf bestimmte Elemente über XPath. Nicht gebraucht werden Dinge wie Rendern, Interpretieren von JavaScript, CSS o.ä. Das Ganze für C++ und am liebsten plattformunabhängig, sonst aber für Windows. Außerdem soll es kein riesiges Framework wie Qt sein.
HTML-Librarys habe ich schon ein paar vielversprechende gefunden (zur Zeit bin ich bei htmlcxx), allerdings ohne XPath. XPath-Librarys wiederum scheint es nur in Verbindung mit XML-Libs zu geben. Für mich sieht es im Moment so aus, als müsste ich entweder den HTML-DOM umständlich in einen XMl-DOM einer anderen Library (z.B. TinyXML) konvertieren und dann dort mit einer XPath-Library (z.B. TinyXPath) weiterarbeiten. Oder ich implementiere XPath selbst.
Kennt jemand eine Library, die HTML und XPath vereint?
Alternativ: ich möchte eigentlich nur bei einer Website bestimmte Informationen herausfiltern. Kennt jemand dazu eine bessere Möglichkeit?
-
Für XPATH brauchst du XML, sollte also mit TinyXPath kein Problem sein.
Mit HTML4 wird es schon schwieriger.
Deshalb benütze ich für C++ nur noch Qt. Da gibt es für die unterschiedlichsten Anwendungsfälle (Komplexität/Schnelligkeit) eine geeignete Klasse.
-
Andere Frage: Wie gut muss die Library mit falschem HTML-Code umgehen müssen? Kannst du garantieren, dass da standardmäßiges XHTML bzw. HTML5 vorliegt oder kann das jede beliebige Seite sein (= Quirks-Mode dringend nötig)
Noch eine Frage: Für Data extraction gibt es bereits fertige Lösungen, interessiert dich der Inhalt dieser Lehrveranstaltung: http://www.dbai.tuwien.ac.at/staff/baumgart/aexin11/index.html ?
Edit: Ja, andere Ansätze (= fertige Lösungen) gibt es, bspw. eben: http://www.lixto.com/?page_id=50
Edit 2: Freie Produkte sollte es auch geben, google mal nach "Web Data Extraction"
MfG SideWinder
-
Es geht um eine bestimmte Seite, die beim Überfliegen eigentlich ganz ordentlich aussieht. Und da wiederrum geht es um ganz bestimmte vereinzelte Informationen mit denen dann im Programm weiter gearbeitet wird. Im Prinzip würden dazu reguläre Ausdrücke ausreichen, das hat für mich aber zu viel von einem Hack. In jeden Fall scheinen mir die Data Extraction-Lösungen aber Overkill (auf die Folien der TU Wien habe ich im Übrigen keinen Zugriff).
Ich denke ich werde XPath selbst implementieren, das ist auch mal wieder eine nette Übung. Und fürs erste brauche ich auch nur einen Bruchteil der Funktionalität.
-
Und was spricht gegen TinyXPath oder Xerces?
MfG SideWinder
-
SideWinder schrieb:
Und was spricht gegen TinyXPath oder Xerces?
Vor allem dass beides XML-Libraries sind, welche mir die HTML-Seite dann doch um die Ohren schlagen, z.B. weil im
img
-Tag hinten der Slash fehlt oder weil das Entity
nicht definiert ist. Ich könnte wahrscheinlich mit z.B. htmlcxx den HTML-DOM erstellen und diesen dann in einen XML-DOM z.B. von TinyXML umwandeln. Diesen könnte ich dann mit TinyXPath durchsuchen. Nur klingt das irgendwie für mich wie gewollt und nicht gekonnt.Ich dachte halt es gäbe vielleicht eine Library, die auch XPath auf HTML-DOMs machen kann. Oder vielleicht sogar eine generische XPath-Library auf beliebigen Bäumen... klingt das zu abwegig?
-
Ich befürchte da gibt es tatsächlich nichts. XPath ist es nun einmal sehr wichtig wie der DOM-Baum aussieht und jede HTML-Library mit Quirks-Mode wird es nicht schaffen können einen einheitlichen DOM-Baum aus verschiedenen Übelkeiten verschiedener Websites zu bauen.
Dementsprechend wird wohl das Aufbauen an sich und dann die Abfrage einer nun standardgemäßen Datenstrukur als zwei verschiedene Tasks einfließen - denke ich mir mal
BTW: Wenn die dafür ausgelegten Tools "overkill" sind bin ich immer noch für die RegEx-Methode
MfG SideWinder
-
libxml2 hat XPath Support und einen HTML4-Parser. http://xmlsoft.org/
SideWinder schrieb:
BTW: Wenn die dafür ausgelegten Tools "overkill" sind bin ich immer noch für die RegEx-Methode
Man kann mit RegEx kein HTML parsen! Siehe: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454
-
rüdiger schrieb:
libxml2 hat XPath Support und einen HTML4-Parser.
Vielen Dank, genau sowas habe ich gesucht. Wäre auch sonst nicht drauf gekommen, dass libxml2 auch einen HTML-Parser hat.
-
rüdiger schrieb:
Man kann mit RegEx kein HTML parsen!
Ach, das gilt doch nur für die Gesamtheit der Sprache, selbstverständlich kann ich damit so manche Hässlichkeit bauen die aus einem HTML-Dokument etwas ausliest. Muss ja keine Abfrage wie XPath sein. Habe mal für ein Programm Quick&Dirty aus den Ergebnissen einer Suchmaschine Daten ausgelesen (damals noch erlaubt). War kein Problem mit RegEx. Wichtig ist nur, dass man von Anfang an kommuniziert, dass es sich dabei maximal um eine temporäre Lösung handeln kann.
Aber du hast natürlich recht, "parsen" geht nicht.
MfG SideWinder