python im Internet & HTML

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

Hallo zusammen

ich habe keine gescheite Überschrift gefunden, aber ich hoffe das ich so den Nagel (so gut als möglich) auf seinen doch sehr kleinen Kopf getroffen habe ...

Die Frage, die sich mir stellt, und ich euch stelle ist, gibt es eine Möglichkeit, und wenn ja, unter welcher (python-eingenen) Bibliothek finde ich die benötigten Methoden?

Ich würde zu gerne, wie bei Firefox (Extras>Web-Entwickler>Entwicklungswerkzeuge ein-/ausblenden>Inspektor) eine Seite auseinander nehmen können (ich glaube das heißt in Knoten unterteilen oder so), um so auf verschiedene Elemente zuzugreifen (z.b. Bilder oder Links, namen u.s.w.)

Ich würde mich über eure Hilfe freuen :)

EvD
BlackJack

@evd: Du suchst einen HTML-Parser. BeautifulSoup oder `lxml.html` sind da die beiden üblichen Alternativen.
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

ist es auch möglich das ganze in, schon in Python implementierten bibs hin zu bekommen, oder muss ich auf so was wie BeautifulSoup oder lxml.html zurückgreifen, um einem Riesigen Aufwand zu entgehen?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@evd: BeautifulSoup ist rein in Python implementiert. Wenn Du meinst, dass Du keine externen Bibliotheken installieren willst, so sei Dir gesagt, daß nur ein kleiner Teil der Funktionalität durch die Standard-Bibliotheken abgedeckt wird, und für vieles andere hat schon jemand viel Zeit investiert, Lösungen zu finden. Warum also das nicht nutzen?
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

ok...

ich habe mir (nun endlich) lxml herunter geladen, und installiert... nur habe ich keinen Schimmer welche Klasse, oder Methode ich hier benutzen soll, da ich keine Ahnung habe was "das herunterladen und bearbeiten einer HTML (XML) Seite" in Fachsprache bedeutet ...

daher die Frage an euch, könnt ihr mir hier ein Tipp geben, oder noch besser, könnt ihr mir sagen wie ihr da ran geht... mein einziger Ausweg ist, alles lesen... aber bis ich das gemacht habe sind n pa tage drauf gegangen, zumal ich die Parser Eigenschaften (auf den ersten blick) hauptsächlich mit dem erstellen einer XML Seite beschäftigen, und nicht mit dem Herunterladen / Bearbeiten könnte ich mir viel zeit ersparen wenn ich Irgendwie schnell den Begriff hätte.


Würde mich freuen von euch Ratschläge und Vorgehensweisen zu hören


edit:

Ich habe bis jetzt

Code: Alles auswählen

root = etree.XML("<root>data</root>")
print(root.tag)
gibt "root" aus (ich vermute mal alle Knoten) aber nun stellt sich die Frage wie kann ich die XML herunterladen??
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

evd hat geschrieben: gibt "root" aus (ich vermute mal alle Knoten) aber nun stellt sich die Frage wie kann ich die XML herunterladen??
Du könntest auf das Requests-Modul zurückgreifen :-)

Und ansonsten: Ja, man muss sich die Doku und API-Beschreibung durchlesen (und am besten parallel in einer Shell mit ausprobieren), wenn man eine Library nutzen will ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Sogar noch ein bisschen mehr: Man muss bei einer Bibliothek die eine API zu einem bestimmten Datenformat bereitstellt in der Regel auch wissen wie das aufgebaut ist. Also speziell hier geht die Dokumentation sicherlich davon aus, dass man XML, HTML, und gegebenenfalls CSS-Selektoren und/oder XPath kennt, oder sich das nötige Wissen aneignet. XML deshalb weil die Dokumentation zu `lxml.html`, soweit ich das beim kurzen drüberlesen gesehen habe, hauptsächlich die Unterschiede und zusätzlichen Methoden zu `lxml.etree` behandelt, denn so ein Objektbaum den `lxml.html` erzeugt ist im Kern ja ein `lxml.etree.ElementTree` mit ein bisschen zusätzlicher Funktionalität.
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

BlackJack hat geschrieben:Sogar noch ein bisschen mehr: Man muss bei einer Bibliothek die eine API zu einem bestimmten Datenformat bereitstellt in der Regel auch wissen wie das aufgebaut ist. Also speziell hier geht die Dokumentation sicherlich davon aus, dass man XML, HTML, und gegebenenfalls CSS-Selektoren und/oder XPath kennt, oder sich das nötige Wissen aneignet.
Mein Eindruck war, dass BeautifulSoup es einfacher macht, mangelndes Vorwissen zu überspielen, um erste Ergebnisse zu erzielen, während lxml (ohne bs als "Wrapper") sich doch sehr "fomal und technisch" gibt; ob das nun ratsam oder wünschenswert ist, ist noch mal eine andere Diskussion. Insofern könnte man sich das vielleicht mal stattdessen ansehen, wenn man dies berücksichtigt.
Zuletzt geändert von nezzcarth am Montag 25. August 2014, 12:06, insgesamt 2-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ein wenig OT, aber was ist eigentlich aus ``html5lib`` geworden? Das galt früher iirc mal als pythonischer als BS...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@nezzcarth: Das liegt vielleicht an der ”Herkunft” von `lxml.html`: XML ist ja auch ein ganzes Stück formaler und strenger als HTML, wenn man XHTML mal aussen vor lässt. Ich persönlich tendiere meistens zu `lxml.html` weil ich auch mit XML zu tun habe, und das Werkzeug daher halt schon kenne. Und ”früher” hatte das noch die Vorteile von XPath und CSS-Selektoren. Da hat BeautifulSoup aufgeholt. Hat zwar kein XPath, das wird durch die Methoden aber ganz gut ausgeglichen.

@Hyperion: Das benutzen doch eigentlich alle, zumindest optional, als Parser, oder? Also sowohl `lxml.html` als auch BS4 direkt oder indirekt (wenn BS4 `lxml.html` als Parser verwendet).
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

Hallo zusammen

ich bin wieder am grübeln... ich habe mir das jetzt so weit durchgelesen (ob nun verstanden oder nicht) aber ich habe immer noch nichts hibekommen...

das ist für mich alles schön und gut, beantwortet meine Fragen aber auch nur teilweise.

ich habe z.b. jetzt die Möglichkeit mir einen ElementTree zu erstellen... glaube ich

Code: Alles auswählen

parser = etree.HTMLParser()
tree = etree.parse(StringIO("http://www.amazon.de/"), parser)
print(etree.tostring(tree, pretty_print=True))
nur habe ich jetzt keine Ahnung... ist das jetzt richtig oder nicht ... ich hoffe doch ja....
und wie kann ich jetzt in dem ElementTree ein Bestimmtes Element auswählen ... ich glaube das heißt Mappen ... ergo z.b. an einen gewissen Punkt des HTML springen ....


würde mich über antworte freuen :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

evd hat geschrieben:und wie kann ich jetzt in dem ElementTree ein Bestimmtes Element auswählen ... ich glaube das heißt Mappen ... ergo z.b. an einen gewissen Punkt des HTML springen ....
Das geht IMHO am einfachsten über CSS-Selektoren, auf der verlinkten Seite sind auch einige Beispiele.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@evd: Dass das nicht das macht was Du möchtest solltest Du doch eigentlich schon an der `print()`-Ausgabe sehen:

Code: Alles auswählen

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
  <body>
    <p>http://www.amazon.de/</p>
  </body>
</html>
Ausserdem wurde explizit `lxml.html` vorgeschlagen und nicht `lxml.etree`. Sonst fehlen die praktische Methoden. Zum Beispiel die für CSS-Selektoren.
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

ok, danke... Ich habe mich da ein wenig eingelesen... und stoße aber wieder auf n Problem ... es sagt mir das ich "cssselector" nicht Installiert habe, aber wenn ich die pip versuche nach zu laden (für python3) meckert er herum, er könne keine existierenden Dateien überschreiben ... bin bei Ubuntu14.04

und ich frage mich ob das so richtig ist was ich bis jetzt habe ...

Code: Alles auswählen

from lxml import html
#from lxml.cssselect import CSSSelector
test=html.parse("http://www.amazon.de/")
print(test)
dort liefert er mit "<lxml.etree._ElementTree object at 0x7f07f3064548>" also schon wieder "etree" ... die Antwort von BlackJack macht mich da jetzt etw. unsicher XD


danke schon mal für eure antworten :)
BlackJack

@evd: Gibt es das `lxml`-Package nicht als Deb-Paket bei Ubuntu? Für Python 2 gibt es das jedenfalls. Da braucht man dann ``pip`` nicht bemühen.
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

ka... kann sein ... aber bei lxml habe ich auch nicht das Problem, da läuft alles ohne tadel, aber bei "from lxml.cssselect import CSSSelector" findet es schon cssselect nicht ... ka ... lxml habe ich auch über pip installierten können (unter py3) aber da will es nicht mit machen
BlackJack

@evd: Mit `lxml` meine ich das gesamte `lxml`-Package. Da sollte `lxml.cssselect` eigentlich dabei sein. Vielleicht hattest Du vor dem installieren via ``pip`` nicht alle nötigen Abhängigkeiten installiert?

Edit: Habe das gerade mal ausprobiert: Man muss noch das `cssselect`-Modul installieren. Also nicht `lxml.cssselect` sondern nur `cssselect`.
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

also ich habe es im Ubuntu software Center gefunden (cssselekt) aber ich habe keine ahnung ob das dann für py2 oder 3 ist ... (da steht nischt dabei) und ich habe keinen Schimmer mehr wie ich das mit dem pip machen kann... entweder ich mache diganze zeit einen fehler oder sie wollen mir wirklich sagen das ich es schon installiert habe (sudo pip3 install cssselect) .... hast du da n schimmer?
BlackJack

@evd: Also ich habe es genau so installiert. Wenn das bei Dir nicht funktioniert, dann müsstest Du mal ein bisschen genauer werden was die Fehlermeldungen angeht (kopieren) und wie Du testest das/ob es installiert ist. Nimmst Du dafür auch einen *neuen* Interpreterlauf?
evd
User
Beiträge: 34
Registriert: Donnerstag 20. Juni 2013, 19:19

Code: Alles auswählen

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/lxml/cssselect.py", line 16, in <module>
    external_cssselect = __import__('cssselect')
ImportError: No module named 'cssselect'
beim herunterladen

Code: Alles auswählen

pip can't proceed with requirement 'cssselect' due to a pre-existing build directory.
 location: /tmp/pip_build_root/cssselect
This is likely due to a previous installation that failed.
pip is being responsible and not assuming it can delete this.
Please delete it and try again.

Storing debug log for failure in /home/evd/.pip/pip.log
Antworten