2017-02-03 4 views
0

Я знаю, что есть проблема с датой - не знаю где. Когда я пытаюсь очистить прогестрически старые таблицы, мои возвращенные данные представляют собой цикл через сегодняшние данные. Я думаю, мне нужен еще один инкапсулирующий цикл, чтобы перейти на более старые страницы.python beautifulsoup scraping archive страницы

Как я могу решить эту проблему?

from urlparse import urljoin 
from urllib2 import urlopen 
import requests 
from bs4 import BeautifulSoup 
import re 
from datetime import datetime, timedelta 

url = "http://www.wsj.com/mdc/public/page/2_3022-mfsctrscan-moneyflow-{}.html?mod=mdc_pastcalendar" 
start = datetime.today() 

def only_weekdays_range(start, n): 
    i = 0 
    wk_days = {0, 1, 2, 3, 4} 
    while i != n: 
     while start.weekday() not in wk_days: 
      start -= timedelta(days=1) 
     yield start 
    i += 1 
    start -= timedelta(days=1) 


for _ in (only_weekdays_range(start, 5)): 
    print ("data for {}".format(start.strftime("%b %d %y"))) 
    url = url.format(start.strftime('%Y%m%d')) 
    print 'Retrieving information from: ' + url 
    print '\n' 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content, "lxml") 
    div_main = soup.find('div', {'id': 'column0'}) 
    table_one = div_main.find('table') 
    def target_row(tag): 
     is_row = len(tag.find_all('td')) > 5 
     row_name = tag.name == 'tr' 
     return is_row and row_name 

    rows = table_one.find_all(target_row)[1:] 
#print rows 
    for row in rows: 
     cells = row.findAll('td') 
     industry = cells[0].get_text() 
     data = { 
      'name' : cells[0].get_text() 
     print data 
     print '\n' 

ответ

1

У вас есть две переменные start

  • глобальной start = datetime.today()
  • местного def only_weekdays_range(start, n):

Вы можете изменить локальный start в функции

start -= timedelta(days=1) 

, и вы вернете его с помощью yield, а затем назначьте его _ в for _ in ..., но вы его не используете. Вы используете глобальный, который не изменяется.

Вы должны использовать значение из _

for new_date in (only_weekdays_range(start, 5)): 
    print ("data for {}".format(new_date.strftime("%b %d %y"))) 
    url = url.format(new_date.strftime('%Y%m%d')) 
    print 'Retrieving information from: ' + url 

Но у вас есть неправильные отступы в функции

def only_weekdays_range(start, n): 
    i = 0 
    wk_days = {0, 1, 2, 3, 4} 
    while i != n: 
     while start.weekday() not in wk_days: 
      start -= timedelta(days=1) 
     yield start 
     i += 1 
     start -= timedelta(days=1) 

Рабочий пример (т.е. как new_date.):

from datetime import datetime, timedelta 

# --- functions --- 

def only_weekdays_range(start, n): 
    one_day = timedelta(days=1) 
    for _ in range(n): 
     while start.weekday() > 4: 
      start -= one_day 
     yield start 
     start -= one_day 

# --- main --- 

start = datetime.today() 

for new_date in only_weekdays_range(start, 10): 
    print ("data for {}".format(new_date.strftime("%b %d %y %a"))) 

Результат:

data for Feb 03 17 Fri 
data for Feb 02 17 Thu 
data for Feb 01 17 Wed 
data for Jan 31 17 Tue 
data for Jan 30 17 Mon 
data for Jan 27 17 Fri 
data for Jan 26 17 Thu 
data for Jan 25 17 Wed 
data for Jan 24 17 Tue 
data for Jan 23 17 Mon 

EDIT: с if вместо while

def only_weekdays_range(start, n): 
    one_day = timedelta(days=1) 
    for _ in range(n): 
     weekday = start.weekday() 
     if weekday > 4: 
      start -= one_day * (weekday-4) 
     yield start 
     start -= one_day 

EDIT: Я вижу, другая проблема

В

url = url.format(...) 

Вы перезаписываете url, поэтому в следующем цикле вы не можете его изменить.

Использование

full_url = url.format(...) 

r = requests.get(full_url) 
+0

Таким образом, текст для меняются «retreiving информации от.» - но URL не увеличивающаяся отражать отдачу от старых дат - постоянно толкая данные сегодня - говорит, что это от старых дат –

+0

та же проблема - вы должны использовать 'new_date' вместо' start' - это очевидно. BTW: см. Первый код - есть 'new_date' в' url.format (new_date.strftime ('% Y% m% d')) ' – furas

+1

Теперь я вижу другую проблему' url = url.format (...) ' - вы перезаписываете 'url', поэтому в следующем цикле вы не можете изменить дату - используйте' full_url = url.format (...) ' – furas