Importieren von Daten aus dem Internet

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.
BlackJack

Samstag 17. Januar 2009, 17:42

Man kann BeautifulSoup sagen, dass es HTML-Entities dekodieren soll. Dann braucht man sich da nicht selber drum zu kümmern.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Samstag 17. Januar 2009, 19:21

BlackJack hat geschrieben:Man kann BeautifulSoup sagen, dass es HTML-Entities dekodieren soll. Dann braucht man sich da nicht selber drum zu kümmern.
Ah, sehr schoen. Werd ich mal einbauen...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Montag 19. Januar 2009, 10:43

So, hier ist die geaenderte Version:

Code: Alles auswählen

#!/usr/bin/env python

import re
import urllib2
from BeautifulSoup import BeautifulSoup

try:
    url = urllib2.urlopen("http://www.fz-juelich.de/gs/meteo/metmess1de/")
    soup = BeautifulSoup(url.read(),
                         convertEntities=BeautifulSoup.HTML_ENTITIES)

    temp =  soup.find(text=re.compile("Lufttemperatur")).findNext("td")
    output = temp.contents[0].string.strip()

except urllib2.URLError:
    output = "Unknown"

print output
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Donnerstag 5. Februar 2009, 16:47

Danke für eure Hilfe. Das hat mir wirklich sehr geholfen, abe rich hab weiterhin ein Problem. Wenn ich:

Code: Alles auswählen

url = urllib2.urlopen("http://www.wetteronline.de/Thueringen/Erfurt.htm")
soup = BeautifulSoup(url.read(),
                         convertEntities=BeautifulSoup.HTML_ENTITIES)
print soup
dann kommt immer nur :
Bild

ich habs auch schon so probiert:

Code: Alles auswählen

url = urllib2.urlopen("http://www.wetteronline.de/Thueringen/Erfurt.htm")
soup = BeautifulStoneSoup(url.read(), convertEntities=BeautifulStoneSoup.HTML_ENTITIES).contents[0] 
print soup
Würde mich über Ratschläge freuen.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Donnerstag 5. Februar 2009, 17:05

Ich würde mal sagen, dass du da ein Gif-Bild erwischt hast ;) Und da das binär is, bekommst du natürlich Datensalat. Konkret würde ich mal auf das Sponsor-Bildchen tippen.
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Donnerstag 5. Februar 2009, 17:51

Gibt es eine Möglichkeit denoch an die gewünschten Daten, in diesem Fall die Höchst- und Tiefsttemparatur, zu kommen? Am besten mit dem gleichen Weg wie bei der Temperatur aus Jülich.

EDIT:

Code: Alles auswählen

try: 
    url = urllib2.urlopen("http://www.wetter.com/wetter_aktuell/wettervorhersage/3_tagesvorhersage/?id=DE0002469/") 
    soup = BeautifulSoup(url.read(), 
                         convertEntities=BeautifulSoup.HTML_ENTITIES)
print soup
Woran liegt es das nicht der ganze Quelltext ausgegeben wird? Stattdesen bricht er in der Zeile
<div id="logo"><a href="http://www.wetter.com/" title="wetter.com"></a></div></div></div></div></body></html>
ab und so komme ich nicht an alle relevanten Daten
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 5. Februar 2009, 19:25

Also die URL tut bei mir gar nicht - schätze dass das ein Fehler sein könnte ;)
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Donnerstag 5. Februar 2009, 20:04

Ich danke allen die mir direkt/indirekt geholfen haben mein Problem zu lösen. Ich hab eine mit wetter24.de eine Homepage gefunden von der man ohne Probleme an die gewünschen Daten kommt.

EDIT: Nochmal eine Frage:
<td width="83" class="first">Windgeschw. Bft (km/h)</td>
<td width="54"><div class="wind"><div class="bft">1</div><div class="kmh">(2)</div></td>
Daraus möchte ich nur die (2) haben, wenn ich nun:

Code: Alles auswählen

url = urllib2.urlopen("http://www.wetter24.de/de/home/wetter/weltwetter/ortewetter.html?cityID=49X16528&tx_mgcityweatherstatic_pi1[cityIDuse]=49X16528") 
soup = BeautifulSoup(url.read(), convertEntities = BeautifulSoup.HTML_ENTITIES) 
temp =  soup.find(text=re.compile("Windgeschw. Bft (km/h)")).findNext("td") 
output = temp.contents[0].string.strip() 
dann erscheint folgende Fehlermeldung bei mir:
Traceback (most recent call last):
File "C:***\wetter.py", line 18, in <module>
temp = soup.find(text=re.compile("Windgeschw. Bft (km/h)")).findNext("td")
AttributeError: 'NoneType' object has no attribute 'findNext'
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 5. Februar 2009, 22:49

Dann wird er wohl nichts gefunden haben.

Es ist mir sowieso völlig unklar, warum man Wetterdaten aus HTML scrapen will, wenn die doch durchaus als XML verfügbar sind, so wie sie etwa das WeatherApplet verwendet. yr.no scheint mir eine ziemlich brauchbare Quelle zu sein.

Und ein Client dafür ist absolut trivial. Ich will aber trotzdem bessere Selektoren in ElementTree.
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Donnerstag 5. Februar 2009, 23:20

Oh dies Variante war mir bis jetzt nicht bekannt. Ich werd es morgen mal ausprobieren.

zu meiner Frage:
Aber es muss doch eigentlich etwas gefunden haben, die entsprechende daten sind doch vorhanden
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 5. Februar 2009, 23:57

Da wird nichts gefunden, weil es ein regulärer Ausdruck ist. In dem haben Zeichen wie ``.``, ``(`` und ``)`` eine spezielle Bedeutung, also musst du sie selbst escapen (fluchten?) oder Python sagen, dass es escaped werden soll.
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Freitag 6. Februar 2009, 14:07

Danke dir Leonidas für den Hinweis mit XML. das ist wirklich einfach.

Denoch nur kurz zur Kontrolle:

Code: Alles auswählen

# -*- coding: UTF-8 -*-

from __future__ import with_statement
from urllib import urlopen
from contextlib import closing
from xml.etree import ElementTree as ET

mile_to_km = 1.60934
url = 'http://www.yr.no/place/Germany/Thuringia/Nordhausen/forecast.xml'

with closing(urlopen(url)) as remote:
    root = ET.fromstring(remote.read())
    first_match = root.find('.//temperature')
    temperature = float(first_match.attrib['value'])
    print temperature
So les ich die Temperatur von http://www.yr.no/place/Germany/Thuringi ... recast.xml aus, oder?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 6. Februar 2009, 18:12

Boldi hat geschrieben:So les ich die Temperatur von http://www.yr.no/place/Germany/Thuringi ... recast.xml aus, oder?
Wenn es den richtigen Wert anzeigt, würde ich stark auf "Ja" tippen. Achja, ``find`` findet den ersten Treffer, im XML sind in der Regel mehrere Daten. Musst schauen ob du wirklich diesen Treffer haben willst.

Achja, das ``mile_to_km = 1.60934`` brauchst du ja wohl bei der Temperatur-Berechnung eher nicht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Samstag 7. Februar 2009, 00:38

Leonidas hat geschrieben: Achja, das ``mile_to_km = 1.60934`` brauchst du ja wohl bei der Temperatur-Berechnung eher nicht.
/dev/glaskugel sagt mir, dass er es nicht bei der Temperatur belässt, sondern auch noch Wingeschwindigkeit usw. auslesen möchte ;-) Aber generell hast Du natürlich Recht, dass es zu diesem Bsp. nicht dazu gehört!
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Samstag 7. Februar 2009, 15:29

Wenn es den richtigen Wert anzeigt, würde ich stark auf "Ja" tippen. Achja, ``find`` findet den ersten Treffer, im XML sind in der Regel mehrere Daten. Musst schauen ob du wirklich diesen Treffer haben willst.
Der erste Wert der gefunden wird, ist auch der aktuelle. Das ist also kein Prolem.
Achja, das ``mile_to_km = 1.60934`` brauchst du ja wohl bei der Temperatur-Berechnung eher nicht.
/dev/glaskugel sagt mir, dass er es nicht bei der Temperatur belässt, sondern auch noch Wingeschwindigkeit usw. auslesen möchte Aber generell hast Du natürlich Recht, dass es zu diesem Bsp. nicht dazu gehört!
Ja das gehört da wirklich nicht rein, mein Fehler. Für die Windgeschwindigkeiten brauch ich es aber. :wink:
Antworten