Seite 1 von 2

Verfasst: Samstag 17. Januar 2009, 17:42
von BlackJack
Man kann BeautifulSoup sagen, dass es HTML-Entities dekodieren soll. Dann braucht man sich da nicht selber drum zu kümmern.

Verfasst: Samstag 17. Januar 2009, 19:21
von Rebecca
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...

Verfasst: Montag 19. Januar 2009, 10:43
von Rebecca
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

Verfasst: Donnerstag 5. Februar 2009, 16:47
von Boldi
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.

Verfasst: Donnerstag 5. Februar 2009, 17:05
von cofi
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.

Verfasst: Donnerstag 5. Februar 2009, 17:51
von Boldi
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

Verfasst: Donnerstag 5. Februar 2009, 19:25
von Leonidas
Also die URL tut bei mir gar nicht - schätze dass das ein Fehler sein könnte ;)

Verfasst: Donnerstag 5. Februar 2009, 20:04
von Boldi
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'

Verfasst: Donnerstag 5. Februar 2009, 22:49
von Leonidas
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.

Verfasst: Donnerstag 5. Februar 2009, 23:20
von Boldi
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

Verfasst: Donnerstag 5. Februar 2009, 23:57
von Leonidas
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.

Verfasst: Freitag 6. Februar 2009, 14:07
von Boldi
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?

Verfasst: Freitag 6. Februar 2009, 18:12
von Leonidas
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.

Verfasst: Samstag 7. Februar 2009, 00:38
von Hyperion
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!

Verfasst: Samstag 7. Februar 2009, 15:29
von Boldi
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:

Verfasst: Samstag 7. Februar 2009, 17:15
von DasIch
mile_to_km würde ich allerdings komplett groß schreiben, ist schliesslich eine Konstante. Bei dem Namen würde ich sonst eher eine Funktion dahinter vermuten.

Verfasst: Samstag 7. Februar 2009, 19:33
von Leonidas
Ist es bei XML nicht so, dass die Reihenfolge der Knoten egal ist? Dann ist die Tatsache dass der erste Treffer der aktuellste nur implementationsdetail und kann sich jederzeit ändern.

Verfasst: Samstag 7. Februar 2009, 20:54
von BlackJack
Generell ist es nicht egal, nur wenn die Formatbeschreibung sagt, dass es egal ist. Attribute haben keine feste Reihenfolge, aber Knoten schon. Stell Dir mal vor das würde bei XHTML nicht gelten, dann dürften Browser ja einfach so Absätze beliebig vertauschen. :-)