BigNum schrieb:
Und das DOM basiert auf was? Eben!
Auf was denn?
BigNum schrieb:
Jetzt musst Du nur noch erklären warum es über DOM besser ist und hier eine funktionierende Lösung präsentieren...
Warum es besser ist? Ich finde es eigentlich nicht komisch, bei Problemen Technologien einzusetzen, die extra für diese gemacht wurden. Regex sitzt hier nur in der zweiten Reihe.
Wie du sicherlich weißt, sind reguläre Ausdrücke für reguläre Sprachen gedacht. HTML ist aber komplexer als eine reguläre Sprache, es ist zumindest mal eine kontextfreie Sprache. Für kleine Probleme wie die des TS mag dies nicht von Bedeutung sein (ich sagte ja nicht, dass es nicht geht), aber mit regulären Ausdrücken kann man HTML nicht komplett begreifen. Beispielsweise ist es nicht möglich, mit regulären Ausdrücken alleine einen HTML-Parser zu bauen.
Das ganze wird dadurch etwas aufgeweicht, dass man die Mächtigkeit von regulären Ausdrücken in Programmiersprachen künstlich erhöht. Das non-greedy-Flag, welches es heutzutage eigentlich in jeder Implementierung gibt, ist bereits nicht mehr regulär. Zufälligerweise ist die Regex-Implementierung im von dir verwendeten Perl eine der mächtigsten überhaupt und quasi turing-vollständig, vielleicht findest du es deswegen so gut. Das gilt aber eben lange nicht für alle Sprachen.
Und dann eben ganz praktische Dinge. Reguläre Ausdrücke sind wohl kaum intuitiver zu verstehen als traversieren über DOM, mit welcher Technologie auch immer. Außerdem sind regulare Ausdrücke bei HTML fehleranfällig für die kleinsten Änderungen, unerwartete Whitespaces beispielsweise.
Habe jetzt keine Lust, hier jetzt alles aufzulisten. Reguläre Ausdrücke sind halt nicht der top-notch für HTML.
http://stackoverflow.com/questions/7196915/regular-expressions-vs-xpath-when-parsing-html-text
http://stackoverflow.com/questions/3406174/which-is-faster-xpath-or-regexp
http://stackoverflow.com/questions/...ept-xhtml-self-contained-tags/1732454#1732454
Hier mal quick n dirty wie ich es gemacht hätte:
Code:
require 'rubygems'
require 'nokogiri'
require 'open-uri'
doc = Nokogiri::HTML(open("http://www.hazzardofdarkness.net/modules.php?name=Playlist"))
doc.xpath("//div[@id='playlist']//tr[position() > 2]/td[@class='band']").each do |node|
puts node.text + " | " + node.next.text
end
BigNum schrieb:
Klar, es ist immer so, daß alles was andere schon gelöst haben als trivial erscheint.
Mitnichten.
BigNum schrieb:
Tipp: Beschäftige Dich mal mit
Assoziativen Arrays (oder manchmal auch Hash genannt) dann erscheint Dir das vielleicht auch als
trivial.
Tipp: Erst mal das Problem in vollem Umfang verstehen. Nicht nur Duplikate sind möglich, sondern auch das Gegenteil, Lieder können vereinzelt fehlen wenn man Seite x + 1 vor Seite x aufruft. Bleibt nur, von Seite 1 bis 70xx step by step durchzugehen, mit Nebenläufigkeit ist nichts mehr. Da das nicht das aller schönste ist, hielt ich eine bessere Lösung für nicht trivial.
edit:
While it is true that asking regexes to parse arbitrary HTML is like asking Paris Hilton to write an operating system, it's sometimes appropriate to parse a limited, known set of HTML.
Trifft es ziemlich gut.
edit: Und klar, wenn das Quell-HTML dermaßen verhunzt ist, dass es nicht ohne reguläre Ausdrücke geht.