2016-03-31 12 views
2

Ich schrieb eine Funktion, die Daten von einer Website für mehrere Postleitzahlen kratzt. Der Code funktioniert für die meisten Postleitzahlen, aber es gibt einige, bei denen ich einen unbekannten String Error bekomme.Getting "Unbekannte Zeichenfolge Fehler"

ist hier der Code, den ich in den Beiträgen Liste

import time 
from datetime import date, timedelta 
from bs4 import BeautifulSoup 
import urllib2 
from dateutil.parser import parse 
import pandas as pd 
import random 
import os 
url = 'https://www.sittercity.com/jobs/search?distance=50&&page=1&per_page=100000&search_strategy=babbysitting_job&&selected_facets%5Bnew_jobs%5D=true&sort=relevance&zipcode=94513' 
soup = BeautifulSoup(urllib2.urlopen(url)) 
posts = [t.text for t in soup.find_all(class_ = "item posted-by")] 
dates = [parse(item, fuzzy = True) for item in posts] 

Der Fehler kommt aus dem 34. Punkt mit. Allerdings ist der Datentyp jedes Elements in der Liste gleich, daher bin ich verwirrt. Auch der 33. Eintrag in der Liste scheint zu funktionieren. Zum Beispiel:

Dies funktioniert: (?)

dates_single = parse(posts[32], fuzzy = True) 

Aber dies bedeutet nicht

dates_single = parse(posts[33], fuzzy = True) 

Hier sind die Werte der Beiträge [32] und Beiträge [33]

>>> posts[33] 
u'Posted by April A. on 3/28/2016' 
>>> posts[32] 
u'Posted by Chandrika M. on 3/30/2016' 

Ich lese die datetil.parser Dokumentation durch und keiner der "Unknown String Error" Anwendungsfälle scheint zu passen.

+1

Können Sie die Werte von 'posts [32]' und 'posts [33]' posten? – gariepy

+0

Ich habe sie einfach in meiner Frage – mangodreamz

+0

gepostet. Also werde ich eine Vermutung riskieren ... 'dates_single()' nimmt 'April' in Beiträgen [33] auf und versucht, das zu einem Datum zu konvertieren! Was passiert, wenn Sie 'fuzzy' auf 'False' setzen? – gariepy

Antwort

4

Ihr Fehler tritt aufgrund eines Konflikts zwischen April (erkannt als Monatsname) und 3 als Monatsnummer erkannt auf.

Minimal Beispiel:

from dateutil.parser import parse 
parse(u'Posted by Chandrika M. on 3/30/2016', fuzzy=True) # datetime.datetime(2016, 3, 30, 0, 0) 
parse(u'Posted by April A. on 3/28/2016', fuzzy=True) # ValueError: Unknown string format 
parse(u'Posted by XYZ A. on 3/28/2016') # datetime.datetime(2016, 3, 28, 0, 0) 

Da Ihr Format gut definiert ist man einfach einfache Konvertierung durchführen kann, ohne Heuristiken.

s = u'Posted by April A. on 3/28/2016' 
datetime.datetime.strptime(s.split()[-1], "%m/%d/%Y") # datetime.datetime(2016, 3, 28, 0, 0) 
+0

Macht Sinn. Vielen Dank! – mangodreamz

+0

Zur Klarstellung, es ist nicht, dass es April wie ein Monatsname fuzzy-matched. Das 'Fuzzy'-Schlüsselwort bezieht sich nur auf die Tatsache, dass der Parser alles in der Zeichenfolge ignoriert, die kein Datum ist. Der Grund dafür ist, dass es 2 Werte für den Monat findet. 'parse ('April 28/2016')' würde nach 'datetime (2016, 4, 28) 'mit oder ohne' fuzzy 'analysieren. – Paul

Verwandte Themen