1 Antwort

Ich würde es mit Beautiful Soup machen.

Am besten drückst du dann F12 im Brower um den HTML code sehen zu können und vergleichst mehrere übersetzte Vokabeln auf gleiche Code-Blöcke. Mit Beautiful Soup kannst du dann auch einfach auf die einzelnen Attribute zugreifen.

PythonFragen 28.08.2016, 20:03

Kannst du mir einen Ansatz zeigen, wie ich diese Tabelle auslese? Die Dokumentation ist unverständlich. Dort steht nicht, wie man eine HTML Seite in das Programm bekommt.

0
LifeArtist1 28.08.2016, 20:05
@PythonFragen

Ich schreibe gerade ;) Kam mir dann doch zu wenig für ne Antwort vor. Wie du aber die Website kriegst und suchst via Python weißt du?

0
LifeArtist1 28.08.2016, 20:24
@PythonFragen

Also als Anfang gucken wir uns mal "Maus" an. Ich gehe davon aus, dass du schon auf der Seite für "Maus" bist.

    Drücke F12 (ich benutze Chrome)
    Bewege meine Maus über die einzelnen Blöcke und sehe dann, das im Body-> div (class="container") -> div (class="table-responsive") meine Tabelle mit den Übersetzungen ist.
    Jetzt weiß ich warscheinlich wonach ich suchen muss mit Beautiful Soup: nach einem div mit der class "table-responsive"
    Sicher ist das aber nicht, da es nur eine Klasse und keine ID ist. Es könnten ja noch andere divs vorhanden sein mit dieser Klasse.

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#quick-start Dort findest du eine such Ansatz: (f+strg) "Here are some simple ways to navigate that data structure:"

Also ich würde erstmal gucken was bei der einfachen Methode rauskommt und nach class "table-responsive" suchen via:

divTable = <bs4object>.find_all("div", { _class : "table_responsive" })

Und wenn mich nicht alles täuscht kriegst du eine Liste zurück, da du ja mehrere elemente finden könntest. 

.... Gut der Code Editor regt mich schon wieder auf. Ich werde später ein vollen Beispiel erstellen. Gerade noch unterwegs.

0
PythonFragen 28.08.2016, 20:30
@LifeArtist1

Ich kenne mich überhaupt nicht mit HTML aus. Habe das nur ein halbes Jahr in der Schule gemacht.. ;)))

Ich habe deinen Codeschnipsel in mein Python Projekt geschrieben, doch es ist glaube ich kein Python Code. Kriege aufjedenfall jede Menge Syntaxfehler.

0
PythonFragen 28.08.2016, 20:33
@PythonFragen

Ok ein wenig Nachdenken schadet nie beim Programmieren. Du meintest das natürlich als Variable ^^

0
LifeArtist1 28.08.2016, 22:48
@PythonFragen

Genau, das sieht doch schon gut aus! Jetzt greifst darauf zu in dem du (da es eine Liste zurück gibt) 

for row in divTable[0].table.find_all("tr"): #wegen dem table tag und tr = table row
    for element in column.findChildren(): #so gehen wir alle th (table headers) und td (table datas) durch
         print(element.text)

Nicht wundern ich müsste .table nicht benutzen, find_all würde auch so es finden aber man erspart praktisch das die Methode noch durch "table" durch muss.

0
LifeArtist1 29.08.2016, 19:11
@PythonFragen
import bs4
import requests as r

websiteHTML = r.get("https://www.frag-caesar.de/lateinwoerterbuch/ridere-uebersetzung.html")
site = bs4.BeautifulSoup(websiteHTML.text, "html.parser") divTable = site.find_all("div", { "class" : "table-responsive"})
for row in divTable[0].table.find_all("tr"): rowElemente = [rowElement.text for rowElement in row.findChildren()] print(rowElemente)

Entschuldigung. Ich meinte natürlich row.findChildren(). Ich habe hier jetzt noch mal ein bissl den code übersichtlicher gemacht.

Das requests modul benutze ich immer um den response code der seite zu empfangen. Hier eben die Seite mit den Übersetzungen.

Ein Problem gibt es noch:
Wenn du das Programm total über Python steuern willst müsstest du noch beachten, dass wenn man z.B nach Pferd sucht, 3 mögliche Übersetzungen findet. Entweder zeigst du diese auch an oder du gibt dem User noch die möglichkeit eine der Übersetzungen auszuwählen.

0
LifeArtist1 29.08.2016, 19:22
@PythonFragen

Ich habe ihn bei mir getestet und ich kriege alle. Hast du den neusten code verwendet ?

0
PythonFragen 29.08.2016, 19:27
@LifeArtist1

Danke es funktioniert soweit ganz gut.

Kannst du mir sagen wie ich die Tabelle so anordne?

Links oben

Links unten

2 von Links oben

2 von Links unten

Aber ich möchte nur den Inhalt haben. Momentan habe ich komische u'Inhalte'

0
LifeArtist1 29.08.2016, 19:32
@PythonFragen

Gut. Wie meinst du das jetzt? Möchtest du jetzt quasi diese Tabelle in Text in Tabellen form ausgeben ?

0
PythonFragen 30.08.2016, 16:10
@LifeArtist1

Mein alternativer Lösungsweg hat mir in einigen Fällen doch falsche Ergebnisse geliefert. 

Ich würde gerne deinen letzten Lösungsweg benutzen, jedoch die Elemente als Text ausgegeben haben und immer nur die 2. Spalte:

Sprich für ridere:

ridere

Verb

E-Konjugation

Infinitiv

lachen\nverspotten

0
LifeArtist1 30.08.2016, 19:07
@PythonFragen

Das ist immer so eine Sache. Ich habe das jetzt erstmal so:

import bs4
import requests as r

websiteHTML = r.get("https://www.frag-caesar.de/lateinwoerterbuch/ridere-uebersetzung.html")
site = bs4.BeautifulSoup(websiteHTML.text, "html.parser") divTable = site.find_all("div", { "class" : "table-responsive"})
data = [] for row in divTable[0].table.find_all("tr"): data.append([rowElement.text for rowElement in row.findChildren()])
print("{0:<15} {1:<15} {2:<15} {3:<15} {4:<15}".format(*data[0][:5])) print("{1:<15} {2:<15} {3:<15} {4:<15} {5}".format(*data[1][:6]))

Das Problem dabei ist, das 2 Zeilen zusammen geschrieben werden. Gucke ich mir nochmal an. Aber wollte dir das erstmal geben dann kannst du ja auch damit rum probieren. Und das ist dann schon mal ein Anfang.

0
PythonFragen 30.08.2016, 20:40
@LifeArtist1

http://pastebin.com/3jBSFC6H

Ich habe jetzt eigenständig diese Lösung entwickelt. 

Kannst mir gerne noch Veränderungen vorschlagen.

Und ich habe noch 2 kleine Probleme:

1. Wenn man das Feld mit der Übersetzung der Vokabel ausliest, dann sind die verschiedenen Übersetzungen immer direkt hintereinander

2. Umlaute werden falsch kodiert wenn ich Zellen auslese mit BeautifulSoup

PS: Kopier doch mal den Code und führe diesen bei dir aus. Funktioniert eigentlich schon ganz zuverlässig.

0
LifeArtist1 30.08.2016, 22:19
@PythonFragen

Erstmal sehr gut das du selbst noch weiter gemacht hast! Machen viele nicht. Eine Sache die mir aufgefallen ist, dass du total viel kopiert hast. Also im Grunde wiederholender Code. Das könnte man in eine neue Methode verpacken.

Ich setze mich mal jetzt hin und schreibe dir etwas mehr code.

Ich würde auch vermeiden so ein großen Block in try zu verpacken. Halte ihn so klein wie möglich um mögliche andere Fehlerquellen nicht zu unterdrücken viel mehr würde ich try als letzten Ausweg empfehlen. 

----

zu 1 das ist mir auch schon aufgefallen, da bastel ich noch was.

zu 2 muss ich mir nochmal angucken

Funktioniert bei mir nicht. Muss ich da jetzt das deutsche oder das lateinische Wort eingeben.

0
PythonFragen 31.08.2016, 07:13
@LifeArtist1

Zu 2: Wenn die Zellen Umlaute beinhalten, dann werden diese falsch angezeigt.

0
PythonFragen 31.08.2016, 07:14
@PythonFragen

Und man muss schon 5 Try Blöcke machen, weil ich 5 Websites aufrufe, die nicht lesbar sein könnten.

0
LifeArtist1 31.08.2016, 14:40
@PythonFragen

http://pastebin.com/HPN3xj79 Guck dir das mal an. So hätte ich das gemacht. Die Methoden sind so geschrieben, dass du sie auch für dein Program einfach verwenden und anpassen kannst. Die Umlaute sind immer noch nicht gefixt. Das liegt irgendwie zwischen requests und bs4. Muss mir das nochmal seperat angucken.

Was meinst du mit nicht lesbar ?
Wenn du meinst das die Website mal nicht aufrufbar sein kann, dann kannst du nur das get in try packen und dann auf diesen error reagieren. 

import requests as r
try:
    r.ghttp://asdasdasddasd")
except r.exceptions.ConnectionError as e:
    print("Connection Error")

so z.B

0
PythonFragen 31.08.2016, 14:50
@LifeArtist1

Vielen dank für deine massigen Lösungen für meine Probleme. Ich bleibe aber erstmal bei meinem Ansatz, weil ich gerne meinen Code benutze ^^, ich werde ihn wahrscheinlich, wenn ich mehr Python Kentnisse besitze, in näherer Zukunft überarbeiten. Aber du hast mir schon sehr geholfen.

Falls du eine Lösung für das Umlaute-Problem hast, ist sie selbstverständlich erwünscht.

Eventuell hätte ich noch den Wunsch, dass bei bei der Form:

die Tabelle von oben nach unten durchgegangen wird. Hättest du da eine Lösung? Du hast ja schon gezeigt, wie man die Zellen mit Koordinaten anspricht.

0
LifeArtist1 31.08.2016, 14:57
@PythonFragen
a = [1,2,3,4]

print(a[::-1])
print(list(reversed(a)))

Hier das sind zwei methoden um eine Liste umgekehrt auszugeben.

0
PythonFragen 31.08.2016, 14:59
@LifeArtist1

Schau dir eventuell nochmal die Tabelle an. Ich möchte alles was unter Form steht bekommen. 

Habe ich deine Lösung nicht verstanden?

0
LifeArtist1 31.08.2016, 20:08
@PythonFragen

Ja alles was unter Form steht. Achso ich glaube mein Beispiel ging in die Falsche richtig. Entschuldigung. Das musst du mit bitte nochmal genauer erklären, von oben nach unten ist das doch jetzt auch schon oder nicht ?

0
PythonFragen 01.09.2016, 16:32
@LifeArtist1

Achso jetzt habe ich deine Lösung auch verstanden. Ich möchte aber nur das, was unter Form steht von oben nach unten auslesen.

0

Was möchtest Du wissen?