HTML-Parser Problem mit Tabelle

Plattformunabhängige GUIs mit wxWidgets.
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Montag 23. März 2009, 12:14

Hallo zusammen.
Ich habe ein Programm, das eine html-Datei parst.
Die html Datei selbst besteht zum größten Teil aus einer Tabelle, die wie folgt aussieht (Ausschnitt):

Code: Alles auswählen

       <tr>
        <td valign="top">Objekt 1</td>

        <td/>
        <td>
          <table border="0" width="100%" cellspacing="0" cellpadding="0">
            <tr>
              <td bgcolor="#ff0000">
                <span style="color:#ffffff">BlaBlaBla - Erklärung zu Objekt 1</span>
              </td>
            </tr>

          </table>
        </td>
      </tr>
      <tr>
        <td valign="top">Objekt 2</td>
        <td>
            Anmerkungen zu Objekt 2
        </td>
        <td>
          <table border="0" width="100%" cellspacing="0" cellpadding="0">
            <tr>
              <td bgcolor="#ff0000">

                <span style="color:#ffffff">Nochmal blablabla zu Objekt 2</span>
              </td>
            </tr>

          </table>
        </td>
      </tr>
Bei Objekt 2 gibt es Anmerkungen, welche es bei Objekt 1 nicht gibt und somit frei bleiben.
Wenn ich die html dann mittels HTMLWindow öffne, wird das "BLABLABLA zu Objekt 1" in die Spalte für die Anmerkungen gezogen.
Würde ich statt <td/> --> <td> </td> schreiben, funktioniert es.
Im Browser wird alles korrekt angezeigt.

Kann das der Parser irgendwie bewältigen? Oder müssen die htmls umgeschrieben werden?

Grüße
Matthias
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Montag 23. März 2009, 14:33

Welcher Parser denn?
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Montag 23. März 2009, 14:46

Öhm, keine Ahnung... ^^

Öffnen tu ich das html-File so:

Code: Alles auswählen

self.window = wx.html.HtmlWindow(...)
self.window.LoadPage(Dir+File)
Dabei wird doch das File geparst, oder??
Oder gibt es eine bessere Möglichkeit ein html-File anzuzeigen? Möchte halt keinen Browser benötigen. (+ die angesprochenen Fehler entfernen)

Entschuldigung, wenn ich mich mit "parsen" vielleicht falsch ausgedrückt hab.
Bin noch Neuling.

Gruß
Matthias
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Montag 23. März 2009, 14:58

Äääh, das ist dann aber ein Sache des HTML-Quellcodes. Da müsstest du in einem HTML-Forum nachfragen, das hat hier nichts mit dem Parser zu tun...
lunar

Montag 23. März 2009, 15:03

Wie kommst du darauf, dass das eine "allgemeine Frage" wäre und keine "wxPython"-Frage und warum nimmst du an, jeder hier würde wxPython nutzen oder überhaupt kennen?

@dauerbaustelle
Und wie kommst du darauf, es wäre kein Problem des Parsers, wenn er korrektes (X)HTML nicht richtig verarbeitet?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Montag 23. März 2009, 15:16

Code: Alles auswählen

       <tr>
        <td valign="top">Objekt 1</td>

        <td/> 
Was ist denn daran bitte korrekt oO
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Montag 23. März 2009, 15:31

@ Dauerbaustelle:
was soll daran nicht korrekt sein? Gut, ab und an mal n Absatz wegen Copy-Paste. (PS: wie schon geschrieben: es ist nur ein Ausschnitt aus dem Dokument!)

@ lunar:
Stimme ich dir zu, Frage hätte ins wxPython-Forum gehört. Mag es auch immer nicht wenn Leute ins falsche Forum posten. Aber auch ich bin nicht vollkommen und es passieren Fehler. Sry, nächstes mal gehts wieder ins richtige.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Montag 23. März 2009, 15:46

m0ps1234 hat geschrieben:@ Dauerbaustelle:
was soll daran nicht korrekt sein?

Code: Alles auswählen

<td/> 
Schon mal so ein HTML-Tag gesehen? -_-
jerch
User
Beiträge: 1630
Registriert: Mittwoch 4. März 2009, 14:19

Montag 23. März 2009, 15:51

Die XHTML-Spezifikation empfiehlt aus Gründen der Interoperabilität, Elemente, die nicht primär als empty definiert sind (wie br), mit einem öffenden und schliessenden Tag ohne Inhalt zu schreiben: td --> <td></td>, aber br --> <br />.

Der Grund hierfür ist, das defacto alle XHTML-Dokumente als "text/html" ausgeliefert werden und die HTML-Parser unterschiedl. mit der XML-konformen Notation umgehen.

@Dauerbaustelle:
<td /> ist korrekt nach XML-Spezifikation. Als "text/xml" ausgeliefert, müßte es laut Spec funktionieren, nur macht sowas keiner, da die XML-Parser mehr als pingelig sind. Daher obiges.
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Montag 23. März 2009, 15:58

alles klar, dankeschön!
lunar

Montag 23. März 2009, 15:59

Dauerbaustelle hat geschrieben:
m0ps1234 hat geschrieben:@ Dauerbaustelle:
was soll daran nicht korrekt sein?

Code: Alles auswählen

<td/> 
Schon mal so ein HTML-Tag gesehen? -_-
Solche Tags sind korrektes HTML 4.01 strict (und korrektes XHTML sowieso):

Code: Alles auswählen

$ tidy -eq
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head><title>foo</title></head>
<body><table>
<tr>
<td>foo</td>
<td/>
</tr>
</table></body></html>
line 5 column 7 - Warning: <table> lacks "summary" attribute
Im Übrigen hättest du das auch selbst im W3C-Validator ausprobieren können ... :roll:
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Montag 23. März 2009, 16:15

WTF, das sieht ja komisch aus.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 23. März 2009, 18:02

Dauerbaustelle hat geschrieben:WTF, das sieht ja komisch aus.
Hilft nix, so ist es halt.

Man kann ja in wx vermutlich auch Gecko irgendwie einbinden, wenn deren HTML-Widget zu primitiv ist.

Achja, hab den Thread verschoben.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Montag 23. März 2009, 20:07

Code: Alles auswählen

#-*- coding:utf-8 -*-
import gtk
from gtkmozembed import MozEmbed

class GeckoWindow(gtk.Window):
    def __init__(self, *args, **kwargs):
        gtk.Window.__init__(self, *args, **kwargs)
        self.moz = MozEmbed()
        self.add(self.moz)
        self.show_all()

    def render(self, data, uri=None, mimetype=None):
        self.moz.render_data(data, long(len(data)),
            uri or 'file:///', mimetype or 'text/html')

if __name__ == '__main__':
    html = """
    $YOURHTML
    """
    win = GeckoWindow()
    win.render(html)
    # wahlweise auch:
    # win.moz.load_url('http://google.de')
    gtk.main()
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Dienstag 24. März 2009, 12:14

Wenn sich wx an dem HTML stört, dann würde ich ja eher empfehlen, das HTML umzuschreiben als Mozilla in das Projekt einzubinden. Das Modul beautifulsoup kommt vielen Spielarten noch relativ korrektem HTML klar und kann dies dann standardkonform ausgeben. Dies könnte man benutzen, bevor man das HTML an wx übergibt.

Stefan
Antworten