Seite 1 von 1

Probleme mit urllib und fehlenden Elementen

Verfasst: Donnerstag 17. September 2015, 14:40
von DynamicBit
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.

Re: Probleme mit urllib und fehlenden Elementen

Verfasst: Donnerstag 17. September 2015, 15:23
von snafu
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.

Re: Probleme mit urllib und fehlenden Elementen

Verfasst: Donnerstag 17. September 2015, 15:33
von DynamicBit
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.

Re: Probleme mit urllib und fehlenden Elementen

Verfasst: Donnerstag 17. September 2015, 15:37
von Sirius3
@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.

Re: Probleme mit urllib und fehlenden Elementen

Verfasst: Donnerstag 17. September 2015, 16:01
von snafu
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.

Re: Probleme mit urllib und fehlenden Elementen

Verfasst: Donnerstag 17. September 2015, 20:51
von 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.

Re: Probleme mit urllib und fehlenden Elementen

Verfasst: Freitag 18. September 2015, 11:34
von DynamicBit
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?

Re: Probleme mit urllib und fehlenden Elementen

Verfasst: Freitag 18. September 2015, 12:11
von Sirius3
@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.

Re: Probleme mit urllib und fehlenden Elementen

Verfasst: Freitag 18. September 2015, 12:27
von DynamicBit
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.

Re: Probleme mit urllib und fehlenden Elementen

Verfasst: Freitag 18. September 2015, 12:56
von snafu
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.

Re: Probleme mit urllib und fehlenden Elementen

Verfasst: Freitag 18. September 2015, 13:31
von 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.