HTML-Parser Problem mit Tabelle

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

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

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

Ö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

Äää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

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

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

@ 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

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: 1669
Registriert: Mittwoch 4. März 2009, 14:19

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

alles klar, dankeschön!
lunar

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

WTF, das sieht ja komisch aus.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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

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
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Hi, ich bins nochmal...
Mit diesem einen Dokument (siehe oben) ging es ja ganz gut.
Jetzt habe ich aber ein Dokument mit 2 Tabellen:

Code: Alles auswählen

<html xmlns:d="http://blablabla.com">
  <body>
    <p>Testblabla</p>
    <h3>Test</h3>
    <table border="1" width="100%">
      <col width="15%"/>
      <col width="30%"/>
      <col width="40%"/>
      <tr>
        <th align="left">Test1</th>
        <th align="left">Test2</th>
        <th align="left">Test3</th>
      </tr>
      <tr>
        <td valign="top">bla</td>
        <td>blabla</td>
        <td>
          <table border="0" width="100%" cellspacing="0" cellpadding="0">
            <tr>
              <td bgcolor="#ff0000">
                <span style="color:#ffffff">blablabla</span>
              </td>
            </tr>
          </table>
        </td>
      </tr>
    </table>

    <h3>Test2</h3>
    <table border="1" width="100%">
      <col width="15%"/>
      <col width="30%"/>
      <col width="40%"/>
      <tr>
        <th align="left">Test1</th>
        <th align="left">Test2</th>
        <th align="left">Test3</th>
      </tr>
      <tr>
        <td valign="top">bla2</td>
        <td>bla2</td>
        <td>
          <table border="0" width="100%" cellspacing="0" cellpadding="0">
            <tr>
              <td bgcolor="#ff0000">
                <span style="color:#ffffff">blablabla222</span>
              </td>
            </tr>
          </table>
        </td>
      </tr>
    </table>
  </body>
</html>
Im Internetexplorer/FF wird es korrekt angezeigt.
Nur mit dem htmlWindow gibt es Probleme, weil er irgendwie die 2 Tabellen nicht packt.
Hab man n Screenshot erstellt:

Bild

Wie könnte ich denn bei sowas weiter vorgehen?
Grüße
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

m0ps1234 hat geschrieben:Im Internetexplorer/FF wird es korrekt angezeigt.
Hallo m0ps1234!

Wenn dein Programm unter Windows ausgeführt wird, dann kannst du den Internet Explorer in dein Programm einbinden. Das funktioniert mit dem "wx.lib.iewin.IEHtmlWindow".

Für MAC gibt es das "wx.webkit.WebkitCtrl".

Dann gibt es noch wxmozilla. http://wxmozilla.sourceforge.net/ Ob und wie es funktioniert, weiß ich allerdings nicht.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Funktioniert wunderbar! :)
Dankeschööön!
Antworten