erste Schritte mit "scraping"

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.
Antworten
PaddyRT
User
Beiträge: 19
Registriert: Samstag 27. November 2021, 15:25

Hallo,

mit wenig Code könnte ich einige interessante Dinge tun und experimentiere deshalb mit "requests" bzw. "lxml":

Code: Alles auswählen

from lxml import html
import requests

Seite = requests.get('https://packages.debian.org/stable/')
Baum = html.fromstring(Seite.content)

Knospen = Baum.xpath('<dt><a href=')
worauf ich den für mich unverständlichen Traceback bekomme:
File "/storage/python/package-parse/./categolist.py", line 9, in <module>
Knospen = Baum.xpath('<dt><a href=')
File "src/lxml/etree.pyx", line 1582, in lxml.etree._Element.xpath
File "src/lxml/xpath.pxi", line 305, in lxml.etree.XPathElementEvaluator.__call__
File "src/lxml/xpath.pxi", line 225, in lxml.etree._XPathEvaluatorBase._handle_result
lxml.etree.XPathEvalError: Invalid expression
Könnte mir bitte jemand ein paar erklärende Worte schicken? :)


Viele Grüße,
Paddy
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst dir ein Tutorial zur XPath-Sprache anschauen. Was du da eingegeben hast ist kein XPath, sondern ein HTML-Fragment. Ein Ausdruck in der Art "//dt/a" oder so waere eher korrekt. Aber das haengt natuerlich auch davon ab, was genau du machen willst.
PaddyRT
User
Beiträge: 19
Registriert: Samstag 27. November 2021, 15:25

Noch immer knappse ich an dem Vorhaben, eine Webseite des Debian Projektes nach Sub-Strings wie '<dt><a href=' zu durchsuchen, um diese dann eine Liste aufzunehmen.

Bisher habe ich zwei Zeilen:

Code: Alles auswählen

page = requests.get('https://packages.debian.org/stable/')
Diese Zeile verstehe ich ungefähr so wie das Datei Handle, oder erfolgt durch das "get" bereits ein herunterladen der Seite?

Code: Alles auswählen

tree = html.fromstring(page.content)
Die gesamten Daten die der Server schickt landen in "tree" und liegen dort als "HTML Element" Objekte vor?

Jedenfalls der wesentliche dritte Schritt fehlt mir. Könnte mir vielleicht doch jemand auf die Sprünge helfen?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das get holt bereits die Seite ab. Und dann hast du ein XML-Dokument in tree, auf dem du arbeiten kannst. ZB mit XPath. Mit substrings hingegen nicht.

So holt man die Attribute href aller Links unterhalb eines dt-elements da raus.

Code: Alles auswählen

from lxml import html
import requests

req = requests.get('https://packages.debian.org/stable/')
document = html.fromstring(req.content)

for link in document.xpath("//dt/a"):
    print(link.attrib["href"])
Antworten