#python
#python
Вопрос:
Все еще довольно новичок в python и впервые использую .replace, и я сталкиваюсь со странной проблемой.
url_base = 'http://sfbay.craigslist.org/search/eby/apa'
params = dict(bedrooms=1, is_furnished=1)
rsp = requests.get(url_base, params=params)
# BS4 can quickly parse our text, make sure to tell it that you're giving html
html = bs4(rsp.text, 'html.parser')
# BS makes it easy to look through a document
#print(html.prettify()[:1000])
# BS4 can quickly parse our text, make sure to tell it that you're giving html
html = bs4(rsp.text, 'html.parser')
# BS makes it easy to look through a document
print(html.prettify()[:1000])
# find_all will pull entries that fit your search criteria.
# Note that we have to use brackets to define the `attrs` dictionary
# Because "class" is a special word in python, so we need to give a string.
apts = html.find_all('p', attrs={'class': 'row'})
print(len(apts))
# We can see that there's a consistent structure to a listing.
# There is a 'time', a 'name', a 'housing' field with size/n_brs, etc.
this_appt = apts[15]
print(this_appt.prettify())
# So now we'll pull out a couple of things we might be interested in:
# It looks like "housing" contains size information. We'll pull that.
# Note that `findAll` returns a list, since there's only one entry in
# this HTML, we'll just pull the first item.
size = this_appt.findAll(attrs={'class': 'housing'})[0].text
print(size) , 'this is the size'
def find_size_and_brs(size):
split = size.strip('/- ').split(' - ')
print len(split)
if 'br' in split[0] and 'ft2' in split[0]:
print 'We made it into 1'
n_brs = split[0].replace('br -', '',)
this_size = split[0].replace('ft2 -', '')
elif 'br' in split[0]:
print 'we are in 2'
# It's the n_bedrooms
n_brs = split[0].replace('br', '')
this_size = np.nan
elif 'ft2' in split[0]:
print 'we are in 3'
# It's the size
this_size = split[0].replace('ft2', '')
n_brs = np.nan
print n_brs
print this_size
return float(this_size), float(n_brs)
this_size, n_brs = find_size_and_brs(size)
Это выводит:
We made it into 1
1
800ft2 -
1br -
800
Я не могу понять, почему он выводит данные дважды, заменяя данные один раз для каждой точки данных.
Мысли? Спасибо
Комментарии:
1. Что вы имеете в виду под «заменой данных один раз»? Что конкретно вы ожидаете от вывода вместо этого?
2. у меня это не работает. Я понимаю
ValueError: invalid literal for float(): 1br - 800
. Вы уверены, что получите этот результат, используя этот код? Может быть, вы запускаете другой код?3. @BrenBarn я хочу получить результат 1 800. в основном данные без br или ft2. Имеет ли это смысл?
4. @furas У меня тоже есть эта проблема, она вызвана тем, что за одной из 2 точек данных следует br из ft2. Если я смогу решить проблему замены, код будет выполняться без ошибок
5. у вас есть один текст
1br - 800ft2 -
, а затем вы используетеreplace('br -') and get
1 800ft2 -`и вы используетеreplace('ft2 -') and get
1br — 800` — так что вы получаете свой странный вывод с двумя результатами. Вы должны разделиться1br - 800ft2 -
раньшеreplace
.
Ответ №1:
Теперь работает для меня. Я внес некоторые изменения в strip
, split
и добавить комментарий # <- here
url_base = 'http://sfbay.craigslist.org/search/eby/apa'
params = dict(bedrooms=1, is_furnished=1)
rsp = requests.get(url_base, params=params)
# BS4 can quickly parse our text, make sure to tell it that you're giving html
html = bs4(rsp.text, 'html.parser')
# BS makes it easy to look through a document
#print(html.prettify()[:1000])
# BS4 can quickly parse our text, make sure to tell it that you're giving html
html = bs4(rsp.text, 'html.parser')
# BS makes it easy to look through a document
#print(html.prettify()[:1000])
# find_all will pull entries that fit your search criteria.
# Note that we have to use brackets to define the `attrs` dictionary
# Because "class" is a special word in python, so we need to give a string.
apts = html.find_all('p', attrs={'class': 'row'})
#print(len(apts))
# We can see that there's a consistent structure to a listing.
# There is a 'time', a 'name', a 'housing' field with size/n_brs, etc.
this_appt = apts[15]
#print(this_appt.prettify())
# So now we'll pull out a couple of things we might be interested in:
# It looks like "housing" contains size information. We'll pull that.
# Note that `findAll` returns a list, since there's only one entry in
# this HTML, we'll just pull the first item.
size = this_appt.findAll(attrs={'class': 'housing'})[0].text
#print(size) , 'this is the size'
def find_size_and_brs(size):
split = size.strip().split(' - ') # <- here strip()
#print len(split)
if 'br' in split[0] and 'ft2' in split[0]:
print 'We made it into 1'
two = split[0].split('n') # <- here split()
n_brs = two[0].replace('br -', '',).strip() # <- here two[0] and strip()
this_size = two[1].replace('ft2 -', '').strip() # <- here two[1] and strip()
#print '>', n_brs, '<'
#print '>', this_size, '<'
elif 'br' in split[0]:
print 'we are in 2'
# It's the n_bedrooms
n_brs = split[0].replace('br', '')
this_size = np.nan
elif 'ft2' in split[0]:
print 'we are in 3'
# It's the size
this_size = split[0].replace('ft2', '')
n_brs = np.nan
print n_brs
print this_size
return float(this_size), float(n_brs)
this_size, n_brs = find_size_and_brs(size)
print '>', this_size, '<'
print '>', n_brs, '<'
ps. Я использую >
, <
print
чтобы увидеть пробелы.
Комментарии:
1. Отлично работает! кроме того, мне нравится подсказка! так хорошо выглядят отпечатки!