Seite 1 von 1

Html Liste in Python Liste

Verfasst: Mittwoch 14. April 2010, 15:30
von INFACT
Hi,

Ich will mit python eine html liste in eine python liste umwandeln. Leider hab ichs nicht so mit rekursion, könnt ihr mir vielleicht helfen?

Hier ist was ich haben will:

Code: Alles auswählen

        
testhtml = """
<ul>
 <li> Contents
  <ul>
   <li> Content1 </li>
    <ul>
     <li> test1 </li>
     <li> test2 </li>
    </ul>
   <li> Content2 </li>
  </ul>
 </li>
 <li> Contents2
  <ul>
   <li> Content1 </li>
   <li> Content2 </li>
  </ul>
 </li>
 <li> Random Text </li>
</ul>
"""
Und dass soll dann am Ende dabei rauskommen:

Code: Alles auswählen

["Contents", ["Content1", ["test1", "test2"], "Content2"], "Contents2", ["Content1", "Content2"], "Random Text"]
Wie kann ich das am besten mit beautifulsoup lösen?

Verfasst: Mittwoch 14. April 2010, 15:43
von Leonidas
Was du suchst ist nicht Rekursion sondern ein HTML-Parser. Wie lxml und html5lib.

Verfasst: Mittwoch 14. April 2010, 15:47
von INFACT
ist beautifulsoup kein html parser?

Verfasst: Mittwoch 14. April 2010, 15:53
von Leonidas
INFACT hat geschrieben:ist beautifulsoup kein html parser?
BeautifulSoup ist etwas, worüber ich inzwischen einen großen Bogen mache. Zudem es ja genug bessere Alternativen gibt.

Verfasst: Mittwoch 14. April 2010, 15:54
von BlackJack
@INFACT: Doch und Du suchst wohl auch nach Rekursion egal welche der Alternativen Du am Ende verwendest.

Verfasst: Mittwoch 14. April 2010, 16:20
von INFACT
also html5lib auf windoofs geht nicht:

Code: Alles auswählen

doc = html5lib.parse("<script>alert('hi');</script>", treebuilder="lxml")

Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    doc = html5lib.parse("<script>alert('hi');</script>", treebuilder="lxml")
  File "C:\Python26\lib\site-packages\html5lib\html5parser.py", line 37, in parse
    p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements)
  File "C:\Python26\lib\site-packages\html5lib\html5parser.py", line 68, in __init__
    self.tree = tree(namespaceHTMLElements)
  File "C:\Python26\lib\site-packages\html5lib\treebuilders\etree_lxml.py", line 176, in __init__
    builder = etree_builders.getETreeModule(etree, fullTree=fullTree)
NameError: global name 'etree' is not defined



>>> doc.nameTuple

Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    doc.nameTuple
  File "C:\Python26\lib\site-packages\html5lib\treebuilders\simpletree.py", line 72, in getNameTuple
    if self.namespace == None:
AttributeError: 'Document' object has no attribute 'namespace'
Obwohl das in der Doku so angegeben ist.

lxml gibt es nicht für python2.6 und windoofs

Edit: oh, doch gerade gefunden

Verfasst: Mittwoch 14. April 2010, 16:25
von Leonidas
INFACT hat geschrieben:also html5lib auf windoofs geht nicht:
Wenn man lxml nicht installiert hat aber den lxml-Traabuilder auswählt ist das auch nicht verwunderlich, dann tuts nämlich auf keinen System. Aber es gibt auch den ElementTree-Treebuilder, der sollte für deine Bedürfnisse reichen.

Verfasst: Mittwoch 14. April 2010, 16:55
von INFACT
Also ich habe jetzt lxml. Wie kann ich denn verhindern, dass der in die tags rein geht.

wenn ich jetzt das html beispiel von oben haben und dann iter aufrufe, gibt der mir jedes tag, ich will aber dann nur Contents, Contents2 und Random Text

Verfasst: Mittwoch 14. April 2010, 17:26
von DasIch
INFACT hat geschrieben:ist beautifulsoup kein html parser?
Völlig irrelevant da beautifulsoup Tod ist.

Verfasst: Mittwoch 14. April 2010, 18:17
von BlackJack
@DasIch: Interessant wo doch das letzte Release grade mal 5 Tage her ist. Oder meinst Du wirklich "Tod" statt "tot"? Warum? Es ist ein einzelnes, reines Python-Modul was man einfach mitliefern kann und das mit Jython und IronPython läuft. Alternativen *dazu*?

Verfasst: Mittwoch 14. April 2010, 18:55
von jbs
Leonidas hat geschrieben:
INFACT hat geschrieben:ist beautifulsoup kein html parser?
BeautifulSoup ist etwas, worüber ich inzwischen einen großen Bogen mache. Zudem es ja genug bessere Alternativen gibt.
Was stört dich denn daran?

Verfasst: Mittwoch 14. April 2010, 19:39
von lunar
jbs hat geschrieben:
Leonidas hat geschrieben:
INFACT hat geschrieben:ist beautifulsoup kein html parser?
BeautifulSoup ist etwas, worüber ich inzwischen einen großen Bogen mache. Zudem es ja genug bessere Alternativen gibt.
Was stört dich denn daran?
Lies die Implementierung ... dann weißt Du schon, was daran stört.

Verfasst: Mittwoch 14. April 2010, 19:59
von gerold
lunar hat geschrieben:Lies die Implementierung ... dann weißt Du schon, was daran stört.
Hallo lunar!

Ich hatte mal Probleme mit einer Website mit versauten Encodings. Diese Site lies sich nicht mit BeautifulSoup parsen. Aber ansonsten hat es mich immer zur vollsten Zufriedenheit unterstützt.

Ich möchte die Frage wiederholen: Was stört dich denn daran?

lg
Gerold
:-)

Verfasst: Mittwoch 14. April 2010, 20:12
von lunar
@gerold: Ich sage nicht, dass es nicht funktioniert. Aber die Implementierung ist abenteuerlich und alles andere als schöner Quelltext. Zudem ist der Parser im Vergleich zu lxml und auch html5lib sehr langsam.

Verfasst: Mittwoch 21. April 2010, 14:19
von INFACT
INFACT hat geschrieben:Also ich habe jetzt lxml. Wie kann ich denn verhindern, dass der in die tags rein geht.

wenn ich jetzt das html beispiel von oben haben und dann iter aufrufe, gibt der mir jedes tag, ich will aber dann nur Contents, Contents2 und Random Text
Geht das denn, oder muss ich mir einen eigenen miniparser schreiben?

Verfasst: Mittwoch 21. April 2010, 14:30
von Hyperion
INFACT hat geschrieben:
INFACT hat geschrieben:Also ich habe jetzt lxml. Wie kann ich denn verhindern, dass der in die tags rein geht.

wenn ich jetzt das html beispiel von oben haben und dann iter aufrufe, gibt der mir jedes tag, ich will aber dann nur Contents, Contents2 und Random Text
Geht das denn, oder muss ich mir einen eigenen miniparser schreiben?
Ich kapiere die Frage nicht! Du musst die Datenstruktur, wie Du sie haben willst, natürlich noch manuell aufbauen. lxml hilft Dir nur, alle in Frage kommenden Knoten zu finden / zu besuchen. Was Du dann mit den Daten machst, ist Deine Sache.