2016-03-31 3 views
2

Я написал функцию, которая сбрасывает данные с веб-сайта для нескольких почтовых индексов. Код работает для большинства почтовых индексов, но есть некоторые, где я получаю Неизвестную ошибку строки.Получение «Неизвестной ошибки строки»

Вот код, я использую

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] 

ошибка исходит из 34-й позиции в списке сообщений. Однако тип данных каждого элемента в списке один и тот же, поэтому я смущен. Также, похоже, работает 33-й элемент в списке. Например:

Это работает: (?)

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

Но это не

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

Вот значения сообщений [32] и [33 сообщений]

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

Я прочитал документацию datetil.parser, и ни один из примеров использования «Неизвестная строка» не подходит.

+1

Можете ли вы публиковать значения 'posts [32]' и 'posts [33]'? – gariepy

+0

Просто отправил их в мой вопрос – mangodreamz

+0

Так что я буду опасаться догадки ... 'date_single()' набирает «апрель» в сообщениях [33] и пытается преобразовать это в дату! Что произойдет, если вы установите 'fuzzy' в False? – gariepy

ответ

4

Ваша ошибка возникает из-за конфликта между April (определяется как имя месяца) и 3, который определяется как номер месяца.

Минимальный пример:

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) 

Поскольку ваш формат хорошо определен, вы можете просто выполнить прямое преобразование, без каких-либо эвристики.

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

Имеет смысл. Благодаря! – mangodreamz

+0

Как уточнение, это не значит, что он нечеткий, сопоставленный апрелю как название месяца. Ключевое слово 'fuzzy' просто ссылается на то, что синтаксический анализатор будет игнорировать что-либо в строке, которая не является датой. Причина этого не в том, что она находит 2 значения за месяц. 'parse ('April 28/2016')' будет анализировать 'datetime (2016, 4, 28)' с или без 'fuzzy'. – Paul

Смежные вопросы