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

Beitragvon 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:

Beitragvon Rebecca » 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:

Beitragvon Rebecca » 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
Benutzeravatar
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Beitragvon Boldi » 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

Beitragvon cofi » 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.
Benutzeravatar
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Beitragvon Boldi » 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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 5. Februar 2009, 19:25

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

Beitragvon Boldi » 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'
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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.
Benutzeravatar
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Beitragvon Boldi » 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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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.
Benutzeravatar
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Beitragvon Boldi » 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?
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » 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: 7471
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » 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!
Benutzeravatar
Boldi
User
Beiträge: 32
Registriert: Montag 29. Dezember 2008, 11:02
Wohnort: Erfurt
Kontaktdaten:

Beitragvon Boldi » 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:

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder