ubuntuusers.de

Python: Zahl im String um eins erhöhen

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Hallo!

Ich will die Launen von Myspace-Usern parsen und nutze hierfür die ID's aus den jeweiligen Span-Tags.

Das ist so aufgebaut:

id="ctl00_ctl00_ctl00_cpMain_cpMain_cpfMainBody_StatusUpdate_rptfriendStatus_ctl00_statusAndstatusTime"
id="ctl00_ctl00_ctl00_cpMain_cpMain_cpfMainBody_StatusUpdate_rptfriendStatus_ctl01_statusAndstatusTime"
id="ctl00_ctl00_ctl00_cpMain_cpMain_cpfMainBody_StatusUpdate_rptfriendStatus_ctl02_statusAndstatusTime"
...

Wie kriege ich nun am elegantesten eine For-Schleife hin, die mir die markierte Zahl jeweils um eins erhöht?

Ich habe es schon so probiert:

ctl_number = re.compile('\d+')
ctl_id = 'ctl00_ctl00_ctl00_cpMain_cpMain_cpfMainBody_StatusUpdate_rptfriendStatus_ctl0%d_statusAndstatusTime' % ctl_number
moods = (''.join(mood(text=True)) for mood in soup('span', id=ctl_id))
for mood in moods: print mood

Aber da kommt nichts. ☹

Wenn ich hingegen einen der Strings von oben als ID einsetze, klappt es.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4702

Wohnort: Berlin

Was heisst bitte "da kommt nichts"? Da kommt ein TypeError:

In [129]: import re

In [130]: ctl_number = re.compile('\d+')

In [131]: '%d' % ctl_number
---------------------------------------------------------------------------
<type 'exceptions.TypeError'>             Traceback (most recent call last)

/home/bj/<ipython console> in <module>()

<type 'exceptions.TypeError'>: int argument required

Ein kompilierter regulärer Ausdruck ist nunmal keine Zahl. Irgendwie logisch, oder?

snafu1

(Themenstarter)
Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Ach sorry. Das hatte ich auch und dann %s eingesetzt:

>>> ctl_id = 'ctl00_ctl00_ctl00_cpMain_cpMain_cpfMainBody_StatusUpdate_rptfriendStatus_ctl0%s_statusAndstatusTime' % ctl_number
>>> print ctl_id
ctl00_ctl00_ctl00_cpMain_cpMain_cpfMainBody_StatusUpdate_rptfriendStatus_ctl0<_sre.SRE_Pattern object at 0x8547b10>_statusAndstatusTime

Und danach hatte ich mit ctl_id wie beschrieben weitergearbeitet und dann hat die For-Schleife nichts ausgegeben.

Hintergrund ist, dass ich bei was ähnlichem - wo aber nur die reine Zahl gefordert wurde - den Zähler um je eins erhöhen konnte.

Da hab ich allerdings auch nicht über einen weiteren String gearbeitet sondern direkt re.compile eingesetzt:

thread_number = re.compile('\d+')
html = soup('a', tabindex=thread_number)
titles = (''.join(thread(text=True)) for thread in html)

EDIT: Ich glaube ich versuche da gerade absoluten Blödsinn, wenn ich so drüber nachdenke. \^^

snafu1

(Themenstarter)
Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Wah, ich weiß gerade echt nicht wie ich das in Programmcode ausdrücken soll... ☹

Was ich will:

- Einen String wo eine bestimmte Stelle bei Null anfängt
- Diesen String an BeautifulSoup zum Parsen übergeben und das Ergebnis in den Generator "moods" dazupacken
- Wenn er was findet → neuen String mit erhöhter Ziffer erzeugen usw
- Wenn er nichts findet → for-Schleife beenden
- Man weiß dabei nicht, wielange er erhöhen muss, weil die Anzahl der Myspace-Freunde ja variiert

Kann mir bitte jemand zumindest nen Denkansatz liefern? ☺

snafu1

(Themenstarter)
Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Nachdem ich dann mal richtig rum gedacht hatte, kam ich endlich zur Lösung:

ctl_id = re.compile('ctl00_ctl00_ctl00_cpMain_cpMain_cpfMainBody_StatusUpdate_rptfriendStatus_ctl\d+\d+_statusAndstatusTime')
moods = (''.join(mood(text=True)) for mood in soup('span', id=ctl_id))
Antworten |