Probleme mit urllib und fehlenden Elementen

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
DynamicBit
User
Beiträge: 4
Registriert: Donnerstag 17. September 2015, 14:30

Hi,

ich habe folgendes Problem: Ich versuche eine Internetseite über urllib zu öffnen. Das läuft auch soweit ganz gut, wenn da nicht die verschwindenden Elemente währen.

Der bisherige Code:

Code: Alles auswählen

import os
from bs4 import BeautifulSoup
import urllib.request

sourceFile = './sources.txt'
downloads = './downloads/'

sources = open(sourceFile)

for source in sources:
	if 'mavencentral' in source:
		temp = source
		temp = temp[temp.find(':')+1:len(temp)-1]
		vendor = temp
		if not os.path.isdir(downloads + vendor + '/'):
			os.makedirs(downloads + vendor + '/')
		print(vendor)
		page = urllib.request.urlopen('http://search.maven.org/#search%7Cga%7C1%7C' + vendor)
		parsed_html = BeautifulSoup(page.read())
		print(parsed_html.body.find_all('d0 tooltip'))

Vendor ist der Suchbegriff für die Plattform.
In der letzten Codezeile möchte alle Elemente erhalten in denen der Suchbegriff "d0 tooltip" vorkommt.

Jemand eine Idee wo der Fehler liegen könnte?
Vielen Dank im vorraus.


Nachtrag: Wenn ich mir den Quelltext der Seite in einem Browser anzeigen lasse, fehlen die gesuchten Elemente. Wenn ich aber den DOM Explorer vom Browser nehme finde ich diese.
Zuletzt geändert von DynamicBit am Donnerstag 17. September 2015, 15:33, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mach mal ein `print(page.read())`, anstelle von `BeautifulSoup(page.read())` und guck im Ergebnis, ob die Elemente dort angezeigt werden. Ich vermute nämlich, dass der zu parsende HTML-Code kaputt ist. Dann kann es nämlich sein, dass sowohl der Browser als auch BeautifulSoup diese kaputten Elemente verwerfen.
DynamicBit
User
Beiträge: 4
Registriert: Donnerstag 17. September 2015, 14:30

Habs jetzt folgendermaßen getestet:

Code: Alles auswählen

page = urllib.request.urlopen('http://search.maven.org/#search%7Cga%7C1%7C' + vendor)
print(page.read())
Nach wir vor das selbe Problem.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@DynamicBit: das DOM wird ja auch dynamisch mit JavaScript erzeugt. Du brauchst also einen Browser, der Dir auch das Javascript interpretiert.
Zum Code: was soll das Umbenennen von Variablen in "temp"? Pfade setzt man nicht mit + sondern mit os.path.join zusammen.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Richtig. Der obere Teil des Schleifenkörpers ließe sich auch einfach schreiben als:

Code: Alles auswählen

vendor = source[source.find(':')+1:len(source)-1]
Und ich vermute sogar, dass ein ``vendor = source.split(':', 1)[1]`` den selben Effekt hätte.
BlackJack

@snafu: Es hätte sogar den netten Effekt das einem auffallen würde wenn kein ':' vorkommt, denn da würde `find()` -1 liefern was ja aber ein gültiger Index ist, aber wahrscheinlich nicht der, den man wollte.
DynamicBit
User
Beiträge: 4
Registriert: Donnerstag 17. September 2015, 14:30

Alle gemachten Vorschläge umgesetzt. Sieht nun Übersichtlicher aus. Danke.


Nachtrag:
Und ich vermute sogar, dass ein ``vendor = source.split(':', 1)[1]`` den selben Effekt hätte.
Eher weniger. Das letzte Zeichen verwerfe ich, da es sich um ein Steuerzeichen handelt, welches am Ende von jeder Zeile im Inputfile steht.

das DOM wird ja auch dynamisch mit JavaScript erzeugt. Du brauchst also einen Browser, der Dir auch das Javascript interpretiert.
Ist es nicht so das Javascript Clientseitig läuft. Von daher müssten doch Bereits die Informationen zu den Einträgen, welche von der Datenbank kommen, ohne eine eventuelle Nachbereitung durch Javascript, an den Client ausgeliefert werden. Von daher müssten die Informationen vorhanden sein. Oder bekomme ich durch meinen Code die Daten sogar, nur werden dieser beim Empfangen direkt verworfen?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@DynamicBit: das was da hinten an jeder Zeile dran ist, ist der Zeilenumbruch, den man am einfachsten per rstrip wegbekommt.

Das erste, was man macht, wenn man irgendwelche Daten von einer Web-Seite laden will, ist, ersteinmal im Browser zu schauen, was denn da so hin und her geschickt wird. Da sollte Dir dann auffallen, dass die eigentliche Suche über http://search.maven.org/solrsearch/sele ... 20&wt=json stattfindet und Du frei Haus schönes JSON geliefert bekommst.
DynamicBit
User
Beiträge: 4
Registriert: Donnerstag 17. September 2015, 14:30

Sirius3 hat geschrieben:@DynamicBit: das was da hinten an jeder Zeile dran ist, ist der Zeilenumbruch, den man am einfachsten per rstrip wegbekommt.

Das erste, was man macht, wenn man irgendwelche Daten von einer Web-Seite laden will, ist, ersteinmal im Browser zu schauen, was denn da so hin und her geschickt wird. Da sollte Dir dann auffallen, dass die eigentliche Suche über http://search.maven.org/solrsearch/sele ... 20&wt=json stattfindet und Du frei Haus schönes JSON geliefert bekommst.

Das mit dem rstrip funktioniert wunderbar.

Habe mir nun mal den Datenaustausch zwischen dem Server und dem Client angesehen und gesehen das der Datenaustausch anders stattfindet, als von mir angenommen. Danke, wieder was dazu gelernt.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier mal alternativ unter Verwendung von `.partition()` und ohne das Zeilenende-Zeichen:

Code: Alles auswählen

head, sep, tail = source.partition(':')
vendor = tail.rstrip()
Wenn aber ohnehin JSON ausgeliefert wird, dann ist das `json`-Modul aus der Standardbibliothek natürlich zu bevorzugen.
BlackJack

Oder man nimmt das externe `requests`-Modul statt `urllib` und bekommt JSON dann auch gleich davon dekodiert zurück wenn das mit dem passenden MIME-Typ ausgeliefert wird.
Antworten